shell if 对字符串的判断

shell中关于if判断十分重要,Bash能够执行各种测试,可以使用 if 、if else 以及逻辑运算符来测试,用比较运算符来比较数据项。除此之外,还有一个test指令也可以用于测试。

if 的用法

if 条件

if condition;
then
    commands;
fi

else if 和 else

if condition;
then
    commands;
else if condition;
then
    commands;
else
    commands;
fi

if 和 else 语句能够嵌套使用,if 的条件部分可能变得很长,但是可以使用逻辑运算符将它变得简洁一些:

[ condition ]  && action;  # 如果condition 为真,则执行action

[ condition ]  && action;  # 如果condition为假,则执行action

&& 是逻辑与运算,|| 是逻辑或运算。

算术比较

比较条件通常被房子在封闭的中括号(或者是方括号)内,一定要注意在 [或] 与操作数之间有一个空格。如果忘记了这个空格,shell脚本就会报错。

[$var -eq 0 ] or [ $var -eq 0]    注意这里是少了空格,会报错的

对变量或值进行算术条件比较大小

[ $var -eq 0 ]  # 当$var 等于0时,返回真

[ $var -ne 0 ]   # 当 $var 不为0时,返回真 

其他重要的操作符

-gt  #大于    相当于 >

-lt  #小于     相当于 <  

-ge  #大于或等于  相当于 >=

-le  #小于或等于  相当于 <=

 

-a 是逻辑与操作,and的意思

-o 是逻辑或的操作,or的意思

[ $var1 -ne 0 -a $var2 -gt 2 ]  #使用逻辑与  -a

[ $var1 -ne 0 -o $var2 -gt 2 ]  #使用逻辑或  -o

 

文件系统相关判断

[ -f  $file_var ]: 如果给定的变量,包含正常的文件路径,或者文件名,则返回真

[ -d $var ]:如果给定的变量包含目录,则返回真,文件目录存在即为真

[ -e $var ]:如果给定的变量包含的文件存在,则返回真,文件存在即为真

[ -c $var ]:如果给定的变量包含的是一个文件字符设备文件的路径,则返回真

[ -b $var ]:如果给定的变量包含的是一个块设备文件的路径,则返回真

[ -w $var ]:如果给定的变量包含的文件可写,则返回真,也就是说文件具有可写权限

[ -r $var ]:如果给定的变量包含的文件可读,则返回真,也就是说文件具有可读权限

[ -x $var ]: 如果给定的变量包含的文件可执行,返回真,也就是说文件具有可执行的权限

[ -L $var ]:如果给定的变量包含的是一个符号链接,则返回真,也就是说,文件是一个链接文件

考虑下面的例子:

fpath="/etc/passwd"
if [[ -e $fpath ]];
then
    echo "File exists"
else
    echo "Dose not exists"
fi

字符串比较

进行字符串比较是,最好用双中括号(或者双方括号),因为有时采用单个中括号会产生错误

注意,双中括号是Bash的一个扩展特性。如果出于性能考虑,使用ash或者dash来运行脚本,那么将无法使用该特性

比较两个字符串是否相同

[[ $str1 = $str2 ]] : 当str1等于str2时,返回真。也就是说,str1与str2包含的文本是一模一样的

注意:在=前后各有一个空格,如果没有空格,那就不是比较关系了,就变成了赋值语句了。

[[ $str1 == $str2 ]] :这是检查字符串是否相同的另一种写法

[[ $str1 != $str2 ]] : 如果str1与str2不相同,返回真

找出在字母表中靠后的字符串

字符串是一句字符的ASCII码值进行比较的,例如 A 的值是0x41,a 的值是0x61。因此 A 小于 a , AAa 小于 Aaa。

[[ $str1 > $str2 ]]  :如果str1的字母序比str2大,则返回真

[[ $str1 < $str2 ]]  :如果str1的字母序比str2小,则返回真

判断字符串是否为空

[[ -z $str ]] : 如果str为空串,则返回真

[[ -n $str ]] :如果str不为空,则返回真

使用逻辑运算符&& 和 || 能够很容易将多个判断条件组合起来:

if [[ -n $str1 ]] && [[ -z $str2 ]];
then
    commands;
fi

举例:

str1="Not empty"
str2=""

if [[ -n $str1 ]] && [[ -z $str2 ]];
then
    echo str1 is nonempty, str2 is empty string
fi

输出如下:

str1 is nonempty, str2 is empty string

 

另外:

test命令也可以用来判断,用test可以避免使用过多的括号,增强代码的可读性。之前讲过的 [  ] 中的测试条件同样可以用于test命令,例如:

if [ $var -eq 0 ]; then echo "True"; fi

也可以写成:

if test $var -eq 0; then echo "True"; fi

说明:test 是一个外部程序,需要衍生出对应的进程,而Bash是一个内部函数,因此Bash的执行效率更高。test兼容于 Bourne shell,ash,dash等。

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值