逻辑控制
- 条件if
- 分支case、select
- 循环for、while、 until
- break和continue
- 有生之年也许你只需要用到if、for、while
If结构
if [ condition] ; then ..;fi
if [ condition ] ; then ..;else ..;fi
if [ condition ] ; then ..;elif ...;fi
- 简单的逻辑可以使用
&& | |去替代
[ -f file ] && echo file exist | | echo file not exist
- 条件可以用命令返回值代替
条件判断的类型
- 算术判断
- 字符串判断
- 逻辑判断
- shell内置判断
算术判断
-
[ 2 -eq 2 ] 相等
-
[ 2 -ne 2 ] 不等
-
[ 3 -gt 1 ] 大于
-
[ 3 -ge 3 ] 大于等于
-
[ 3 -lt 4 ] 小于
-
[ 3 -le 3 ]小于等于
-
(())也可以表示算术比较。((10>= 8)) ,((10==10)),
字符串比较
-
[ string1 = string2 ] 如果两字符串相同,则结果为真
-
[ string1 != string2 ] 如果两字符串不相同,则结果为真
-
[ -n "$var" ] 如果字符串不是空,则结果为真
-
[ -z "$var" ] 如果字符串是空,则结果为真
-
[[ "xxxx" == x* ] 在表达式中表示0或者多个字符
-
[[ xx == x?? ]] 在表达式中表示单个字符
- 在引用变量的时候要记得加双引号
[ -z "$a" ]否则当a未定义时会语法报错
逻辑判断
-
[ 2 -ge 1 -a 3 -ge 4 ];echo$? 与
-
[ 2 -ge 1 -0 3 -ge 4 ];echo$? 或
-
[[ 2 -ge 1 && 3 -ge 4 ]];echo$? 与
-
[[ 2 -ge 1 || 3 -ge 4 ]];echo$? 或
-
[ !2 -ge 1 ];echo$? 非
内置判断
-
-e file 如果文件存在,则结果为真
-
-d file 如果文件是一个子目录,则结果为真
-
-f file 如果文件是一个普通文件,则结果为真
-
-r file 如果文件可读,则结果为真
-
-s file 如果文件的长度不为0,则结果为真
-
-w file 如果文件可写,则结果为真
-
-x file 如果文件可执行,则结果为真
-
[[]]是[]的扩展语法,在老的sh里并不支持。推荐用[]
Case结构
- 用于条件太多的情况。每一个条件最后使用两个分号结尾,不可缺少。
case $var in
p1)...;;
p2)...;;
...
pn)...;;
*)...;;
esac
Select
Select var in var_list;do ....done;
- 菜单选择,一般与case结构一起用
For循环
for(( c1 ;c2;c3 ));
do
done
for((i=0;i<10;i++));do echo $i;done
For遍历循环
- 用于递归数组,还可以递归以空格隔开的字符串序列。或者是某个命令的返回值。
for f in $array[*]; do
...
done
ss="aa bb cc dd";for x in $ss;do echo $x;done
for x in `ls` ;do echo $x;done
ss=(aa bb cc "sss dd");for x in "${s[@]}";do echo $x;done
While循环
i=0;
while ((i<3));do
echo $i; ((i=i+1);
done
- 一行行的读取文件内容
while read line; do echo $line ; done < /tmp/tmp
until
i=0;
until ((i>3));do
echo $i; .
((i+=1));
done
退出控制
- return 函数返回
- exit 脚本进程退出
- break 退出当前循环
- continue 跳过当前的循环,进入下一次循环