Linux Shell之表示式

2021-09-07 14:01:37 字數 4327 閱讀 2804

嚴格來說,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...