shell编程参考
语言特性
- #后面是注释
- 赋值时变量名前没有$,等号前后不能有空格。
逻辑控制
if [ expression ]; then
statements
fi
if [expression1 ]; then
statements1
elif [ expression2 ]; then
statements2
else
statements3
fi
var=0
while [ $var -lt 10 ]; do
var=$(($var + 1))
done
for ((i=0; i<10; i++)); do
echo $i
done
for name in $(cat userlist); do
echo $name
done
case $option in
a) echo "option -a";;
b) echo "option -b";;
*) echo "unknown option";;
esac
条件测试
- 数值:-eq -ne -gt -lt -ge -le
- 字符串:-z -n = !=
- 逻辑:-a -o !
- 文件:-b -c -r -w -x -s -d -f -e
预定义变量
- $#:实际位置参数个数(不含$0)
- $@:位置参数(不含$0)
- $*:所有位置参数组成的字符串
- $!:上一条后台命令对应的进程号
- $?:最近一条命令执行后的退出状态
- $$:当前进程PID
整数运算
let a++ <=> ((a=a+1))
let a+=5 <=> ((a+=5))
let a=a**2 <=> ((a=a**2))
let a%=7 <=> ((a%=7))
浮点数运算
printf "%.3f\n" $(echo "1/13" | bc -l)
echo "1 13" | awk '{printf("%.3f\n", $1/$2)}'
生成随机数
echo | awk 'BEGIN{srand()}END{for(i=0;i<10;i++) printf("%d\n", 256*rand());}'
字符串操作
- 字符串长度:${#str}
- 切片与子串:
- 从第4个字符开始,取8个字符:${s:4:8}
- 从第5个字符开始到结尾:${s:5}
- 取最后5个字符:${s:(-5)}
- 把变量中的空格换成下划线
- 仅第1处生效:${s/ /_}
- 全部生效:${s// /_}
- 在空格后插入一个下划线
- 仅第1处生效:${s/ / _}
- 全部生效:${s// / _}
- 删除所有空格:${s// /}
- 转换大小写
- 大写:${s^}, ${s^^}
- 小写:${s,}, ${s,,}
- 切换大小写:${s~}, ${s~~}
字符串匹配截取
url="ftp://anoymouns:ftp@mirror.lzu.edu.cn/software/scim-1.4.7.tar.gz"
protocol: ${url%%:*} ==> ftp
domain: tmp=${url##*@}; ${tmp%%/*} ==> mirror.lzu.edn.cn
path: tmp=${url##*@}; ${tmp%/*} ==> mirror.lzu.edu.cn/software
basename: ${url##*/} ==> scim-1.4.7.tar.gz