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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM