最近在写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所指定的用户拥有时返回真。