逻辑控制
- 条件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 跳过当前的循环,进入下一次循环