测试和判断 test命令(也可以使用[]代替test)可用来判断文件 整数 和字符串 返回逻辑值
文件测试 -e 文件存在 -d 文件类型是否为目录 -f文件类型为普通文件
整数比较 -eq (equal)相等 -ge (greater equal)大于等于 -gt(greater than) 大于 -le(less equal)小于等于 -lt(less than)小于
更高级的test支持 ><=等符号的使用 这时要用[[]]符号代表test的高级用法
字符串测试 -n 字符串长度是否非0 -z 是否为0 =字符串判等 !=字符串不等 (详细用法见 man test)
当测试结果为正确时 返回0 返回非0值表示不正确 使用[]时 里面的空格不能少
分支 有if 和case两种
if通用格式: 包括了 if-else if-elif-else if嵌套
if [ $USER = root ]; then if [ $UID = 0 ]; then echo "root 0" elif [ $UID = 1 ]; then echo "root 1" else echo "root" fi else echo "not root" fi
case通用格式 每一项结束使用;; 不需要break 使用*可匹配任意情况
case "$1" in "start"|"START") echo "Starting..." ;; "stop"|"STOP") echo "Stoping..." ;;
*) echo "Usages: $0 {start|stop|reload|reload}" ;; esac
循环 有for和while两种形式 循环也支持 break 和continue
for 形式的
for i in {1..9} do mkdir $i done
shell还支持c语言风格的for 但是shell并不擅长数值计算 这里使用了双圆括号(())
for ((i=1; i<8; i++)) do echo $i done
while 就是满足条件一直执行
i=0 while [ $i -lt 8 ] do echo "$i" ((i++)) done
until 正好和while相反 不满足条件时一直执行
i=0 until [ $i -gt 8 ] do if [ $i -eq 5 ]; then ((i++)) continue elif [ $i -eq 7 ]; then break else echo "$i" ((i++)) fi done
函数 function fname(){} function可以省略 调用时直接使用fname不用加括号 若有参数 直接跟在后面就行了
可在函数里面使用local申请局部变量 $# 代表参数数量 $* 和$@ 代表所有位置参数 shift参数左移 $1 $2 $3 ...代表第1 2 3 个参数
fork炸弹 f (){f|f} f 就是递归调用一直创建进程消耗内存