最近在寫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