1 if 结构
1.1 if then
bash 中会运行if后面的命令,如果该命令的退出码为0(运行成功),then后面的语句才会继续进行
if 后面要加个空格
例子:
testuser=spider
if grep $testuser /etc/passwd
then
echo -n "the bash file for user $testuser is "
ls -a /home/$testuser/.b*
fi
#如果then放在if这行 则需要在if后面加分号
if grep $testuser /etc/passwd; then
echo -n "the bash file for user $testuser is "
ls -a /home/$testuser/.b*
fi
1.2 if then else 若if后面的命令没有运行成功,运行else后面的语句
1.3 嵌套if
else if 的简写是 elif
if xx ; then
xxx
elif xxx ;then
xxx
else
xxx
fi
2 test命令
test有两种写法
if test condition;then
xxx
fi
if [ condition ] ;then
xxx
fi
注意方括号内侧要留个空格
if test 1 -eq 2;then
echo "1==2"
else
echo "1!=2"
fi
if [ 1 -eq 2 ];then
echo "1==2"
else
echo "1!=2"
fi
2.1 数值比较
var=5
if [ $var -eq 5 ];then
echo "$var equals 5"
else
echo "$var not equals 5"
fi
和
var=5
if [ $var -eq "5" ];then
echo "$var equals 5"
else
echo "$var not equals 5"
fi
结果是一样的 都是equals
这说明test将字符串转化为整数了.遇到无法转化的,如"5i"等,就会报错
还有一点要注意,test只支持整数比较,小数会报错.
2.2 字符串比较
注意大于小于要写转义,不然会被认为是重定向符号
var1="test"
var2="Test"
if [ $var1 \< $var2 ];then
echo "$var1 is small"
else
echo "$var2 is small"
fi
这里输出Test is small.
这需要注意: test中的大写字母比小写字母小
sort命令相反.
判断字符串的长度
var=""
if [ -n "$var" ];then
echo "$var is not empty"
else
echo "$var is empty"
fi
var1="123"
if [ -n "$var1" ];then
echo "$var1 is not empty"
else
echo "$var1 is empty"
fi
关于字符串双引号:
赋值时有双引号,取值时没有双引号
比如
var="test"
echo $var
结果是test
在进行字符串比较时,如果字符串为空,而取值时又没加双引号,会有意想不到的结果:
如
var=""
if [ -n $var ] 会变成 if [ -n ] 而非 if [ -n "" ] ,失去了本意
所以在可能为空的地方 需要给变量加上双引号
2.3 文件比较
在对文件或者目录进行操作前,检查下非常有用.
3 复合查询
if [ condition1 ] && [ condition2 ] ;
if [ condition 1 ] || [ conditon2 ]
4 高级特性
4.1 双圆括号 (( ))
圆括号提供了一些列的数学运算
大小于符号不再需要转义
4.2 [[ ]] 双方括号
提供了匹配功能
引用别人的文章:
bash [[ ]] 双方括号
基本要素:
Ø [[ ]] 两个符号左右都要有空格分隔
Ø 内部操作符与操作变量之间要有空格:如 [[ “a” = “b” ]]
Ø 字符串比较中,可以直接使用 > < 无需转义
Ø [[ ]] 中字符串或者${}变量尽量如未使用"" 双引号扩住的话,会进行模式和元字符匹配
[root@localhostkuohao]# [[ "ab"=a* ]] && echo "ok"
ok
Ø [[] ] 内部可以使用 && || 进行逻辑运算
Ø [[ ]] 是bash keyword:[[ is a shell keyword
[[ ]] 其他用法都和[ ] 一样
二者共同特性:
Ø && ||-a –o 处理
[ exp1 -a exp2 ] = [[ exp1 && exp2 ]] = [ exp1 ]&& [ exp2 ] = [[ exp1 ]] && [[ exp2 ]]
[ exp1 -o exp2 ] = [[ exp1 || exp2 ]] = [ exp1 ]|| [ exp2 ] = [[ exp1 ]] || [[ exp2 ]]
[root@localhost ~]# if [[ "a" == "a" && 2 -gt1 ]] ;then echo "ok" ;fi
ok
[root@localhost ~]# if [[ "a" == "a" ]] && [[2 -gt 1 ]] ;then echo "ok" ;fi
ok
[root@localhost ~]# if [[ "a" == "a" ]] || [[ 2 -gt 1]] ;then echo "ok" ;fi
ok
[root@localhost ~]# if [[ "a" == "a" ]] || [[ 2 -gt10 ]] ;then echo "ok" ;fi
ok
[root@localhost ~]# if [[ "a" == "a" || 2 -gt 10 ]] ;then echo "ok" ;fi
ok
Ø [[ ]] 和 [ ] 都可以和 ! 配合使用
优先级 ! > && > ||
逻辑运算符 < 关系运算符
逻辑运算符 : ! && || -a -o
关系运算符 : < > \> \< == = != – eq –ne -gt -ge –lt -le
-----------------------------------------------------------------------------
n [[ ]] 比[ ] 具备的优势
-----------------------------------------------------------------------------
①[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
②支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
③使用[[ ... ]]条件判断结构,而不是[... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。
④bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。
使用[[ ... ]]条件判断结构, 而不是[ ... ], 能够防止脚本中的许多逻辑错误. 比如,&&, ||, <, 和> 操作符能够正常存在于[[]]条件判断结构中, 但是如果出现在[ ]结构中的话, 会报错。
Case语句
USER="rich"
case $USER in
rich | baba )
echo "welcome"
;;
test)
echo "test account"
;;
*)
echo "not welcome"
esac
括号中可以使用正则表达式
竖线表示或
每个条件结束时写 ;;
esac结束