嚴格來說,shell中沒有表示式的概念。shell本身事實上僅僅是一堆命令的集合。當然也不是胡亂的堆在一起。而是有一定的組織。僅僅是這個組織不那麼嚴謹。所以本文不是要真的總結所謂的表示式,而是把shell中一些犄角旮旯的東西拼湊在一起。實在不知道它們屬於那個分類。
m@meng
:~/scripts
$ m=`date`
m@meng
:~/scripts
$ echo $m
2023年 06月 25日 星期四 10:40
:24cstm@meng
:~/scripts
$ n=$(date)
m@meng
:~/scripts
$ echo $n
2023年 06月 25日 星期四 10:40
:37cst
也就是說,`command`和$(command)的效果是一樣的。
m@meng
:~/scripts
$ r=3+4
m@meng
:~/scripts
$ echo $r
3+4m@meng
:~/scripts
$ echo $(($r))
7m@meng
:~/scripts
$ echo $(($r+3))
10
只是,$(()) 中僅僅能用+-*/和()運算子,而且僅僅能做整數運算。
m@meng
:~/scripts
$ q=5
m@meng
:~/scripts
$ echo "$q"
5m@meng
:~/scripts
$ echo '$q'
$q
所以,在單引號中使用變數一定要小心。
所謂界定符。事實上就是將界定符內的字串視為乙個總體,而不會被空格等分隔符打斷。
在雙引號內,全部的特殊字元將保持其轉義含義,如上面的』$』。假設想讓雙引號中的某個特殊字元恢復其本來面目。即取其字面值,能夠在它前面加入轉義字元』\』。例如以下:
m@meng
:~/scripts
$ echo "\$q"
$q
m@meng
:~/scripts
$ grep m new
m@meng
:~/scripts
$ echo $?
1m@meng
:~/scripts
$ cat new
的m@meng
:~/scripts
$ echo $?
0m@meng
:~/scripts
$ m=4
m@meng
:~/scripts
$ echo $?
0
上例,grep命令在new檔案裡沒有找到字元」m」,所以其出口狀態為1;其它都為0,包含賦值語句。
退出狀態經經常使用做if語句的推斷條件。
數字測試
數字測試的比較運算子居然使用的是文字。對照方下(左側是c語言使用的傳統的運算子。右側是shell使用的):
== : -eq
!= : -ne
> : -gt
\< : -lt
>= : -ge
\<= : -le
字串測試
-z str: 若str的長度是0。結果為真(謹記:真 <==> $? == 0)
-n str: 若str的長度不是0,結果為真
s1 = s2 : 兩個字串相等,結果為真
s1 != s2 : 兩個字串不等。結果為真
str : 不加不論什麼選項來測試str。效果同-n
[ ] 表示式
實際上。僅僅有 [ 是命令。而 ] 僅僅是界定符。[ 命令與test命令基本同樣,唯一的差別就是格式不同,[ 命令須要將要測試的表示式置於括號裡,###且表示式左右兩邊分別要和[ ]留乙個空格###。如[ -z 「empty」 ]。
據說,[ 命令的效率略微高一些,我沒驗證過。
還有一點:###[ 命令不支援運算子「>」和「<」###。所以對於字串比較運算的支援可能差一點,這是唯二的差別。。。。
[[ ]]表示式
擴充套件了[ ]命令。首先就是支援了運算子「>」和「<」,另外還支援邏輯運算&&,||。!,例如以下:
m@meng
:~/scripts
$ [ er > et ]
m@meng
:~/scripts
$ echo $?
0m@meng
:~/scripts
$ [[ er > et ]]
m@meng
:~/scripts
$ echo $?
1
顯然,er > et結果應該為假,所以測試表示式的出口狀態是1。
可是沒有效果,而[[ ]]測試正確。
m@meng
:~/scripts
$ [ er > et || er < et ]
bash: [: 缺少 `]`
er:未找到命令
m@meng
:~/scripts
$ [[ er > et || er < et ]]
m@meng
:~/scripts
$ echo $?
0m@meng
:~/scripts
$ [[ er > et && er < et ]]
m@meng
:~/scripts
$ echo $?
1
m@meng
:~/scripts
$ ((m=4-2))
m@meng
:~/scripts
$ echo $m
2m@meng
:~/scripts
$ m=$((4-2))
m@meng
:~/scripts
$ echo $m
2
這意味著,((m=4-2))和m=$((4-2))效果是一樣的。也就是說在(())內部能夠直接完畢賦值。
~~~~
m@meng
:~/scripts
$ echo $((4-2))
2m@meng
:~/scripts
$ echo ((4-2))
bash: 未預期的符號 '(' 附近有語法錯誤
這說明。(())不負責儲存結果,想要結果的話,用』$』來提取。
~~~~
m@meng
:~/scripts
$ m=3;n=2
m@meng
:~/scripts
$ echo $((m-n))
1
這說明,在(())內部使用變數時,不須要加入』$』符號。
~~~~
m@meng
:~/scripts
$ m=3;n=2
m@meng
:~/scripts
$ echo $((m0
m@meng
:~/scripts
$ echo $((m>n))
1
顯然,(())還支援比較運算,唯一的問題是。它的出口狀態與test等其它命令恰好相反!
~~~~
總結一下這個表示式:
1、僅僅支援整數運算。
2、支援的運算包含:=(賦值)、==(相等)、>= <= < > % + - * / -= += /= *= %=。非常豐富了。
邏輯運算
主要有&&、||、-a、-o、!和(),用來計算表示式之間的邏輯運算。支援用括號()來進行組合,邏輯運算子和表示式之間要有空格。
命令僅僅支援符號,不支援-a和-o選項。
m@meng:~/scripts$ [[ er > et -o er < et ]]
bash: 條件表示式中有語法錯誤
bash: '-o' 附近有語法錯誤
完。 linux shell 判斷表示式
檔案比較運算子 e filename 如果 filename存在,則為真 e var log syslog d filename 如果 filename為目錄,則為真 d tmp mydir f filename 如果 filename為常規檔案,則為真 f usr bin grep l filen...
Linux shell指令碼之正規表示式
正規表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元 及這些特定字元的組合,組成乙個 規則字串 這個 規則字串 用來表達對字串的一種過濾邏輯。規定一些特殊語法表示字元類 數量限定符和位置關係,然後用這些特殊語法和普 通字元一起表示乙個模式,這就是正規表示式 regular expre...
Linux shell指令碼之正規表示式
正規表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元 及這些特定字元的組合,組成乙個 規則字串 這個 規則字串 用來表達對字串的一種過濾邏輯。規定一些特殊語法表示字元類 數量限定符和位置關係,然後用這些特殊語法和普 通字元一起表示乙個模式,這就是正規表示式 regular expre...