shell中的条件判断与循环
条件判断符
形式如下:
1 | [ condition1 == condition2 ] |
注意
- 在中括号内的每个组件都必须有空格来分隔
- 在括号内的常量,最好以单引号或双引号括起来
- 在括号内的变量,最好以双引号括起来
1 | name="one two" |
$name会被替换为one two,调试程序输出如下:1
2
3
4
5
6
7
8promote:条件判断 rangaofei$ sh -x condition.sh
+ name='one two'
+ '[' one two == 'one two' ']'
condition.sh: line 2: [: too many arguments
+ '[' one two == one ']'
condition.sh: line 4: [: too many arguments
+ echo no
no
可以看到条件语句被替换为了
[ one two == ‘one two’],所以会报参数过多的错误,所以我们修改程序如下:1
2
3
4
5
6
7
8name="one two"
if [ "$name" == "one two" ];then
echo equal one two
elif [ "$name" == "one" ]; then
echo one
else
echo no
fi
此时可以得到正确的结果。
通过一个表格展示整数的判断依据
标志 | 意义 |
---|---|
n1 -eq n2 | n1==n2 |
n1 -ne n2 | n1!=n2 |
n1 -gt n2 | n1>n2 |
n1 -lt n2 | n1< n2 |
n1 -ge n2 | n1>=n2 |
n1 -le n2 | n1<=n1 |
条件判断
条件判断相对简单,和java中的if..else 和switch..case 类似
if..then
shell中的条件判断主要是if..then关键字。形式如下:1
2
3
4
5
6
7if [ condition ];then
command
elif [ condition ];then
command
else
command
fi
注意一下几点:
- 条件语句的
[]
必须有空格 - 条件判断完成后必须有
;then
elif
也属于条件判断,是除if外的条件和elif内的条件判断成立,与java的else if类似- else没有条件判断,与java的else相似
- 条件判断结束后必须有fi
if [ condition1 ]||[ condition2 ]
表示condition1和condition2至少有一个成立则正确if [ condition1 ]&&[ condition2 ]
表示condition1和condition2全都成立则正确
case..esca
形式如下:1
2
3
4
5
6
7
8
9
10case $variable in
"first")
command
;;
"second")
command
;;
*)
;;
esac
注意一下几点:
- 字符串条件必须以右括号结束
- 每一个条件判断必须以双分号结束
- 必须有*)来表示除列出的条件以外的情况处理
- 结束必须有esca
循环也比较简单,类似于java中的for循环,do..while循环
循环
while..do.done循环
形式如下:1
2
3
4while [ condition ]
do
command
done
当conditon成立时,则执行do中的语句。
一个简单的例子:1
2
3
4
5
6
7declare -i i=0
while [ $i -lt 10 ]
do
i=$i+1
echo i=$i
done
echo complete
输出内容:1
2
3
4
5
6
7
8
9
10
11
12promote:条件判断 rangaofei$ . whiletest.sh
i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9
i=10
complete
until..do..done
形式如下:1
2
3
4until [ condition ]
do
command
done
当conditon成立时则退出循环,与while相反。
for..do.done
与java的foreach循环类似,形式如下:1
2
3
4for var in one two..
do
command
done
比较简单。有一种特殊形式,类似于for循环1
2
3
4for(( 初始值;阈值;执行步长 ))
do
command
done
一个简单的例子:1
2
3
4for(( i=0;i<10;i=i+1 ))
do
echo $i
done
注意空格,和i的取值,步进值也可写成i++
。