linux shell雙括號的使用疑惑

2021-06-19 19:38:51 字數 1733 閱讀 9246

首先copy一下其使用方法:

參考:語法:

((表示式1,表示式2…))

特點:

1、在雙括號結構中,所有表示式可以像c語言一樣,如:a++,b--等。

2、在雙括號結構中,所有變數可以不加入:「$」符號字首。

3、雙括號可以進行邏輯運算,四則運算

4、雙括號結構 擴充套件了for,while,if條件測試運算

5、支援多個表示式運算,各個表示式之間用「,」分開

舉個栗子:

#!/bin/bash

a=1;

b="ab";

echo $((a>1?8:9));

((b!="a"))&& echo "err2";

((a<2))&& echo "ok";

輸出:

[root@izeus41 yuxz]# a.sh 

9err2

ok

but !!!!如果做運算的是多個字元的字串時,(())的返回結果卻大不一樣(注意雙括號裡面變成了b!="as"):

#!/bin/bash

a=1;

b="ab";

echo $((a>1?8:9));

((b!="as"))&& echo "err2";

((a<2))&& echo "ok";

輸出:

[root@izeus41 yuxz]# a.sh 

9ok

因為((b!="as"))返回了1,即false,所以後面不執行了。為什麼為什麼為什麼!

(("a"=="b")) && echo "err2"  居然輸出err2  額

找找資料,

!!!雙括號裡面會把字串都轉化成數字!!!

實驗了一下總結:數字字串=》數字,非數字字串=》0,以下:

#!/bin/sh

a=9((a=="1")) && echo "err1" // 無輸出

((a=="9")) && echo "err1" // 有輸出

b="abc"

((b==1)) && echo "err1" // 無輸出

((b==0)) && echo "err1" // 有輸出

c="123abc"

((c=="123")) && echo "err1" // 報語法錯誤

//bash: ((: 123abc: value too great for base (error token is "123abc")

bash在遇到數字開頭的串時,會將整個串轉化為數字,結果導致溢位錯誤了。

好吧,雙括號在用來判斷條件真假的時候還是比較複雜的,慎用了,最好變數都是數字型別。

以後還是用[ ] 或者[[ ]]來做判斷比較好。當然 (())也有其他用途,這以後再說了。

另外補充一下,bash reference manual裡面的介紹,英文版使用手冊蠻不錯,多學學

(( expression ))

if the value of the expression is non-zero, the return status is 0; otherwise the return status is 1.

雙括號的判斷結果會把[ ]的結果反過來的。不過這跟上面說的結果沒什麼關係了

Linux Shell 管道命令 pipe 的使用

command1正確輸出,作為command2的輸入 然後comand2的輸出作為,comand3的輸入 comand3輸出就會直接顯示在螢幕上面了。通過管道之後 comand1,comand2的正確輸出不顯示在螢幕上面 注意 1 管道命令只處理前乙個命令正確輸出,不處理錯誤輸出 2 管道命令右邊命...

Shell 雙括號運用

在剛開始學習inux shell指令碼程式設計時候,對於它的 四則運算以及邏輯運算。估計很多朋友都感覺比較難以接受。特變邏輯運算子 使用時候,必須保證運算子與算數 之間有空格。四則運算也只能借助 let,expr等命令完成。今天講的雙括號 結構語句,就是對shell中算數及賦值運算的擴充套件。使用方...

雙圓括號結構

雙圓括號結構 與let命令很相似,結構允許算術擴充套件和賦值.舉個簡單的例子,a 5 3 將把變數 a 設為 5 3 或者8.然而,雙圓括號結構也被認為是在bash中使用c語言風格變數操作的一種處理機制.bin bash a 23 c語言風格的變數賦值,兩邊允許有空格.echo a initial ...