Bash编程中的字符串比较实用一般编程语言的比较操作符:
Bash中数值比较的操作符:
比较 | 描述 | 比较 | 描述 |
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小于等于n2 |
数值比较只支持整数,不支持浮点数。
Bash中字符串比较的操作符:
比较 | 描述 | 比较 | 描述 |
str1 = str2 | str1 等于 str2 | str1 > str2 | str1 大于 str2 |
str1 != str2 | str1 不等于 str2 | -z str | str的长度为零,即为空 |
str1 < str2 | str1 小于 str2 | -n str | str的长度不为零,即不为空 |
在用'>'和'<'进行字符串比较时,要对'>'和'<'作转义,否则会被shell解释为输出和输入重定向符。
例:
#!/bin/bash
str="abcdefg"
file=./datafile
if [ "$str" > $file ]; then
stat $file
fi
以上脚本代码的实质是在当前目录创建了一个文件名为'datafile'的空文件!并且无关str的内容!
进行字符串比较时,对变量引用实用双引号引起来,否则容易出问题。
示例:
#!/bin/bash
str1="hello, 51cto"
str2="happy new year"
if [ "$str1" \> "$str2" ]; then
echo "str1 is larger than str2"
else
echo "str1 is smaller than str2"
fi
Bash中文件比较的操作符:
比较 | 描述 | 比较 | 描述 |
-e file | file文件是否存在 | -s file | file存在且不为空 |
-d file | file存在且是目录 | -O file | file存在且被当前用户拥有 |
-f file | file存在且为文件 | -G file | file存在且默认组是当前用户组 |
-r file | file存在且具有可读权限 | file1 -nt file2 | file1比file2新 |
-w file | file存在且具有可写权限 | file1 -ot file2 | file1比file2旧 |
-x file | file存在且具有可执行权限 |
对文件进行 -r -w -x 相关的权限判断时,是相对当前执行该脚本或该操作的用户而言的。比如,
-rwxr--r-- redhat redhat testfile ,若以redhat用户执行" [ -x testfile ]",则结果为真,否则,其它任何普通用户执行,结果为假。
若判断的文件是符号链接文件,则对文件进行 -r -w -x 相关的权限判断,以当前链接文件链接到的那个真正的文件或目录的权限来作判断。另外,如果只是删除符号链接文件本身,而不是要删除符号链接文件链接的那个文件或目录,使用命令:unlink symbolic_file_name
(())命令 和 [[]]命令
双圆括号命令允许在比较中包含高级数学赋值表达式或数学比较表达式。除了支持test命令的基本数学操作符,还支持以下数学操作符:
符号 | 描述 | 符号 | 描述 |
val++ | 先引用后自加一 | << n | 左移n位 |
val-- | 先引用后自减一 | >> n | 右移n位 |
++val | 先自加一后引用 | && | 逻辑与 |
--val | 先自减一后引用 | || | 逻辑或 |
! | 逻辑取反 | & | 按位与 |
~ | 按位取反 | | | 按位或 |
** | 幂运算 | ||
在双圆括号内的表达式,'>','<'不用作转义。表达式也可以不用和前后双圆括号之间有空格。
在双圆括号内的表达式中,对变量的引用可以不用加'$',而直接使用变量名
#!/bin/bash
var1=10
if ((var2=var1**2)) && ((var2 > 50)) ; then
echo "the value of var2 is more than 50."
fi
echo "var2=$var2"
双方括号命令对test命令的扩展,体现在双方括号内的字符串表达式支持glob的正则表达式
#!/bin/bash
match_str="9 .99"
if [[ $match_str = 9?.* ]]; then
echo "match by glob -> match_str :$match_str "
fi
本文出自 “被褐怀玉徳善人间” 博客,请务必保留此出处http://deshan.blog.51cto.com/9295575/1542707