SAKA'S BLOG

shell中的条件判断与循环

shell中的条件判断与循环

条件判断符

形式如下:

1
[ condition1 == condition2 ]

注意

  1. 在中括号内的每个组件都必须有空格来分隔
  2. 在括号内的常量,最好以单引号或双引号括起来
  3. 在括号内的变量,最好以双引号括起来
1
2
3
4
5
6
7
8
name="one two"
if [ $name == "one two" ];then
echo equal one two
elif [ $name == "one" ]; then
echo one
else
echo no
fi

$name会被替换为one two,调试程序输出如下:

1
2
3
4
5
6
7
8
promote:条件判断 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
8
name="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
7
if [ condition ];then
command
elif [ condition ];then
command
else
command
fi

注意一下几点:

  1. 条件语句的[]必须有空格
  2. 条件判断完成后必须有;then
  3. elif也属于条件判断,是除if外的条件和elif内的条件判断成立,与java的else if类似
  4. else没有条件判断,与java的else相似
  5. 条件判断结束后必须有fi
  6. if [ condition1 ]||[ condition2 ]表示condition1和condition2至少有一个成立则正确
  7. if [ condition1 ]&&[ condition2 ]表示condition1和condition2全都成立则正确

case..esca

形式如下:

1
2
3
4
5
6
7
8
9
10
case $variable in
"first")
command
;;
"second")
command
;;
*)
;;
esac

注意一下几点:

  1. 字符串条件必须以右括号结束
  2. 每一个条件判断必须以双分号结束
  3. 必须有*)来表示除列出的条件以外的情况处理
  4. 结束必须有esca

循环也比较简单,类似于java中的for循环,do..while循环

循环

while..do.done循环

形式如下:

1
2
3
4
while [ condition ]
do
command
done

当conditon成立时,则执行do中的语句。

一个简单的例子:

1
2
3
4
5
6
7
declare -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
12
promote:条件判断 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
4
until [ condition ]
do
command
done

当conditon成立时则退出循环,与while相反。

for..do.done

与java的foreach循环类似,形式如下:

1
2
3
4
for var in one two..
do
command
done

比较简单。有一种特殊形式,类似于for循环

1
2
3
4
for(( 初始值;阈值;执行步长 ))
do
command
done

一个简单的例子:

1
2
3
4
for(( i=0;i<10;i=i+1 ))
do
echo $i
done

注意空格,和i的取值,步进值也可写成i++