Shell Coding

Linux Shell 日常编程实用句式速查,注意以下例子如无特殊说明都是 bash 语法。


  • 选择执行环境。
#!/usr/bin/env bash

#!/usr/bin/bash
  • 指定变量默认值,取环境变量,取不到用默认值。
rep=${ENV_YOUR_KEY:-"my-default-value"}
  • 获取当前执行脚本的绝对路径,注意直接用 $0 或 pwd 获取的可能都不要你想要的。
current_dir=$(cd `dirname $0`;pwd)
  • 为当前目录包含子目录下所有 .sh 文件增加可执行权限。
chmod +x `find . -name '*.sh'`
  • 通过 tee 将提示信息显示到终端,并同时写入到文件。
log_file=/var/log/test.log
echo "This line will echo to console and also write to log file." | tee -a ${log_file}
  • 类似于 Java properties 中 key=value 形式的字符串,取 key 和 value 的值。
username_line="username=test"
#key is username
key=${username_line%=*}
#val is test
val=${username_line#*=}
  • 实现 String trim 效果。
#trim string by echo
val_trim=$(echo -n ${val})
  • 声明和循环数组。
apps=(foo bar)
for app in ${apps[@]}
do
  echo "$app"
done
  • 文件 ls 转数组
# ls 转数组,根据需要 grep
arrs=($(ls helmfiles/apps | grep -v .yaml))
  • 指定数组分割符,字符串转数组。
# 获取当前 helm list 命令输出结果,通过换行分割成数组
IFS=$'\n' helm_list=($(helm list --no-headers))

for hm in ${helm_list[@]}
do
    # 对每一行进行解析按 Tab 再分割成数组
    IFS=$'\t' hma=($hm)
    echo "helm upgrade --install ${hma[0]} ${hma[0]} --version ${hma[6]} --reset-values 2>&1"
done
  • 文件按内容排序。
log=my-log-file
# 原地排序覆盖原文件
sort -o ${log} ${log}
  • 判断字符串是否以某串开头,并去除指定前缀。
img=docker.io/nginx:1.20
repo=docker.io
# if 判断字符串是否以 repo 开头
if [[ $img == $repo* ]]; then
  # 注意这里 +2
  suffix=$(echo $img | cut -c$((${#repo}+2))-)
  # 输出  nginx:1.20
  echo "$suffix"
fi
  • 按多个关键词 过滤。
echo "nginx"  | grep -E "nginx|tomcat"
echo "tomcat" | grep -E "nginx|tomcat"
echo "envoy"  | grep -E "nginx|tomcat"
  • 获取当前时间,加减时区。
ct=$(TZ=UTC+8 date "+%Y%m%d%H%M")
  • 检查是否以 root 用户执行。
# check if run as root user
if [[ `id -u` -ne 0 ]]; then
  echo "You need root privileges to run this script."
fi