shell脚本中诡异的if语句

编程语言种类繁多,在不同的语言环境中来回切换难免会出错,特别是shell语法用着要注意。
if语句,if语句得满足那些条件才不报错:

  • 中括号和表达式之间必须得有一个空格;
  • if和中括号之间必须得有一个空格;
  • 语句块以if开始必须得以fi结束。
1
2
3
4
#!/bin/bash 
if [ 1 == 1 ];then
echo 'hello'
fi

带一个分支的if语句,要注意if里面的表达式,shell脚本对缩进没有要求,为了保持代码的整洁用缩进比较好。

1
2
3
4
5
6
#!/bin/bash 
if [ 1 == 0 ];then
echo 'hello'
else
echo 'world'
fi

带多个分支的if语句,是elif不是else if,else if 会造成整个语句块错误。elif中的表达式规则同if

1
2
3
4
5
6
7
8
#!/bin/bash 
if [ 1 == 0 ];then
echo 'hello'
elif [ 1==1 ];then
echo 'world'
else
echo '!'
fi

if语句条件表达式支持 || 、&&等

1
2
3
4
if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then #注意空格,有严格的语法限制 
if [ "$testing" != "" ]; then
if [ "$date_d" == "" ]; then
if [ "$date_total_s" -lt "0" ]; then

if语句可以对文件、数字、字符串进行判断,更详细的文章《shell 循环语句和字段分隔符》

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#文件 
if [ -d /etc ]
# -e filename 如果 filename存在,则为真
# -d filename 如果 filename为目录,则为真
# -f filename 如果 filename为常规文件,则为真
# -L filename 如果 filename为符号链接,则为真
# -r filename 如果 filename可读,则为真
# -w filename 如果 filename可写,则为真
# -x filename 如果 filename可执行,则为真
# -s filename 如果文件长度不为0,则为真
# -h filename 如果文件是软链接,则为真
# filename1 -nt filename2 如果 filename1比 filename2新,则为真。
# filename1 -ot filename2 如果 filename1比 filename2旧,则为真。
#数字:
# == != > >= < <= !
# -eq -ne -gt -ge -lt -le 取非
#字符串:
#-Z -n
#为空 不为空
if [ $STR -n " " ];then
----------------本文结束 感谢阅读----------------