shell中数字和字符串比较的方法
最近在写shell的时候发现数字和字符串的概念模糊,整理一下该方面的知识点。
一、数字之间的比较
如果这种情况下如果双方不是整数比较的内容
会报错integer expression expected。这是因为系统把数字当成了字符串处理。
-eq 等于,如:if [ "$a" -eq "$b" ]
-ne 不等于,如:if [ "$a" -ne "$b" ]
-gt 大于,如:if [ "$a" -gt "$b" ]
-ge 大于等于,如:if [ "$a" -ge "$b" ]
-lt 小于,如:if [ "$a" -lt "$b" ]
-le 小于等于,如:if [ "$a" -le "$b" ]
以下的if条件是双括号。
< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:(("$a" > "$b"))
>= 大于等于(需要双括号),如:(("$a" >= "$b"))
二、字符串之间的比较
=
:检测两个字符串是否相等,相等返回 true。!=
:检两个字符串是否相等,不相等返回 true。-z
:检测字符串长度是否为0,为 0 返回 true。-n
:检测字符串长度是否为0,不为 0 返回 true。str
:检测字符串是否为空,不为空返回 true。- 要记得操作符左右两边都要加空格,否则会报语法错误。
#!/bin/bash # author:陈树义 # site:http://www.shuyi.me a="abc" b="efg" # 字符串是否相等 if [ $a = $b ] then echo "$a = $b : a 等于 b" else echo "$a = $b: a 不等于 b" fi if [ $a != $b ] then echo "$a != $b : a 不等于 b" else echo "$a != $b: a 等于 b" fi # 字符串长度是否为0 if [ -z $a ] then echo "-z $a : 字符串长度为 0" else echo "-z $a : 字符串长度不为 0" fi if [ -n "$a" ] then echo "-n $a : 字符串长度不为 0" else echo "-n $a : 字符串长度为 0" fi # 字符串是否为空 if [ $a ] then echo "$a : 字符串不为空" else echo "$a : 字符串为空" fi
结果: abc = efg: a 不等于 b abc != efg : a 不等于 b -z abc : 字符串长度不为 0 -n abc : 字符串长度不为 0 abc : 字符串不为空
注意:
< 小于,在ASCII字母顺序下.如: if [[ "$a" < "$b" ]] if [ "$a" \< "$b" ] 注意:在[]结构中"<"需要被转义. > 大于,在ASCII字母顺序下.如: if [[ "$a" > "$b" ]] if [ "$a" \> "$b" ] 注意:在[]结构中">"需要被转义. #需要转义<,否则认为是一个重定向符号 if [ $A /< $B ];then echo "[ < ]" fi if [[ $A < $B ]];then echo "[[ < ]]" fi #需要转义>,否则认为是一个重定向符号 if [ $A /> $B ];then echo "[ > ]" fi if [[ $A > $B ]];then echo "[[ > ]]" fi
判断是否为数字的方法
#!/bin/bash ## 方法1 a=1234;echo "$a"|[ -n "`sed -n '/^[0-9][0-9]*$/p'`" ] && echo string a is numbers 第一个-n是shell的测试标志,对后面的串"`sed -n '/^[0-9][0-9]*$/p'`" 进行测试,如果非空,则结果为真。 sed默认会显示所有输入行信息的,sed 的“-n”选项是让sed不要显示,而只显示我们所需要的内容:即后面的表达式所匹配的行,这是通过表达式中加入“p”命令来实现的。 /^[0-9][0-9]*$/他的含义是匹配至少由一位数字构成的行 ## 方法2, 可以,不过不是bash实现的,是使用了grep的正则 #if grep '^[[:digit:]]*$' <<< "$1";then # echo "$1 is number." #else # echo 'no.' #fi ## 方法3 #if [ "$1" -gt 0 ] 2>/dev/null ;then # echo "$1 is number." #else # echo 'no.' #fi ## 方法4,case #case "$1" in # [1-9][0-9]*) # echo "$1 is number." # ;; # *) # ;; #esac ## 方法5,awk #echo $1| awk '{print($0~/^[-]?([0-9])+[.]?([0-9])+$/)?"number":"string"}' ## 方法5,awk #if [ -n "$(echo $1| sed -n "/^[0-9]\+$/p")" ];then # echo "$1 is number." #else # echo 'no.' #fi ## 方法6,expr expr $1 "+" 10 &> /dev/null if [ $? -eq 0 ];then echo "$1 is number" else echo "$1 not number" fi
#!/bin/bash
if [ -n "$1" ]; then
if [[ $1 =~ ^[0-9]+$ ]]; then
echo "$1 Is Number."
else
echo "$1 No Number."
fi
else
echo "please input number!"
fi
说明:if [[ $1 =~ ^[0-9]+$ ]]
(1)=~ 运算符就是进行正则表达式判断之用的,左侧的字符串会依右侧的正则表达式做匹配,
若匹配则结果为true,不匹配则结果为false。
(2)^是开头开头符号,$是结尾符号,+号是多个的意思,不限位数与 *号类似。
(3)if [ -n "$1" ];表示$1不为空;if [ ! -n "$1" ];表示$1为空
即:if [ -n str1 ]当串的长度大于0时为真(串非空)
if的参数
–b 当file存在并且是块文件时返回真
-c 当file存在并且是字符文件时返回真
-d 当pathname存在并且是一个目录时返回真
-e 当pathname指定的文件或目录存在时返回真
-f 当file存在并且是正规文件时返回真
-g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真
-h 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效
-k 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真
-p 当file存在并且是命令管道时返回为真
-r 当由pathname指定的文件或目录存在并且可读时返回为真
-s 当file存在文件大小大于0时返回真
-u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真
-w 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。
-o 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。
参考:
https://www.cnblogs.com/chanshuyi/p/quick_start_of_shell_11_string_compare.html
https://blog.csdn.net/weibo1230123/article/details/113483420