shell中那些反人類的括號使用規則大彙總!


在這裏插入圖片描述

前言

shell 腳本說難也難說不難找起 bug 來確實費勁,是什麼導致 shell 語法規則很大衆化,但是讓我們去找程序的錯誤卻這麼費勁呢?這是因爲 shell 其實是一個不斷增增補補的語言,很多規則都是之前不斷“補丁”上去的,導致讓人感覺很混亂,特別是這個括號匹配,弄的非常的反人類,如果不是經常使用是很難去記憶的。

單小括號 ()

正則表達式中使用

(aa)|(bb)

用於做某個輸出命令,配合$使用

# 這個可以拿到 test.log 的文本
$(cat test.log)

用於數組初始化操作

local arr=(1 2 3 4);

雙小括號 (())

表示其中進行數字類型的計算(而且只支持整型),雙小括號中還支持布爾值判定,並且當被雙小括號框中,整體就應該被看成一個變量。其實這裏雙小括號裏頭就是支持 C 語言語法規則,可以不加美元符,可以再加單小括號把一些運算先括起來等

# 默認 a 是字符串類型
a=1;
# 把 a 看成數字,改變前面定義的變量時,必須要加雙小括號,或者用 let 語句,否則會把其視爲字符串類型
((a++));
let "a++";
# 輸出,雙小括號應該被看成一個變量
echo $((a+1));

做算術運算符比較時,雙小括號表示其中可以使用 C 語言風格,其中變量不用加美元符等

# 這裏下面哪裏加空格都不影響
a=1;
# if 中判斷比較時候的雙小括號,其中可以使用 C 語言風格
if((a==1))
then
	echo "right";
else
	echo "error";
fi;
# for 中算數運算,也完全可以使用 C 語言的形式,如下
for((i=0;i<5;i++))
do
	echo "$i";
done;
# while 中算數運算判斷布爾,也同樣
while((a==1))
do
	echo "$a";
done;

單中括號 []

[ 本來表示一個比較的命令,注意空格

比較的話==!=只支持字符串比較,-eq-gt-lt > < 支持數字類型比較,但是但括號中可不能使用 && 這類的符號哦,想使用就得使用更加擴展的 [[]]

# 其實 [ 本來就是 shell 中的一個命令表示 test 測試布爾值,這也是中括號後爲什麼要空格的原因。shell 中雲算符只支持字符串比較,但是 -eq -gt -lt > < 這些可以支持數字比較
a=1;
# 這裏寫 a -eq 1 也是成立的
if [ a==1 ]
then
	echo "right";
else
	echo "error";
fi;

正則表達式表示中括號中匹配任意一個

# 能匹配其中任一個就表示匹配成功
[123]

數組固定形式,與其他程序一樣

a[0]=1;
printf "${a[0]}";

雙中括號 [[]]

在 [] 上的擴展,支持了通配符甚至是正則匹配和 && 等符號,但是模式必須在右邊

注意這個雙中擴後也要有空格!通常這個 [[]][] 更加實用

a=1;
# 支持 && ||,以往但括號中是不支持的
if [[ $a==1&&$a!=2 ]]
# 支持通配符的匹配
if [[ $a==* ]]
# 支持正則,必須要加 =~
if [[ $a=~\d ]]

大括號 {}

對數組的引用

a[0]=1;
echo "${a[0]}";

正則表達式表示前一個字符出連續出現幾次

{2,}

通配符表示文件切割

# 會創建 test1.sh 和 test2.sh
touch {test1,test2}.sh
# 會創建 test1.sh test2.sh test3.sh test4.sh 這四個文件
touch {test{1..3},test4}.sh
touch {test[1-3],test4}.sh

表達式符號 ``

抱歉,由於我確實不知道這個符號叫什麼名字,目前用表達式符號來代替這個符號的名字

用於寫一個可輸出的表達式,常用於輸出布爾值檢測條件

if `$a -eq $b`

shell 編寫規範

這個編寫規範算是我個人的一個小總結,以後遇到各種情況統一按照如下規範處理,這樣我們就不容易寫錯 shell 腳本了!有點類似 alibaba 編碼規範,但應該不同,這個是我個人總結的心得,哈哈

# 規範一:shell 儘量模仿 c 語言句尾加分號的方式,該加的就加,減少思維負擔
echo "right";

# 規範二:儘量模仿 c 語言編寫方式,不應該多加空格,能不加就最好不要加
if($a==1)

# 規範三:所有的 let 和 echo printf 能加雙引號必須得加
echo "haha";
printf "haha";
let "a++";

# 規範四:shell 中不管是條件語句還是循環語句建議首先使用 (()) 來進行邏輯判定,而不應該先去考慮 [] 和 [[]],因爲 (()) 中表達式的寫法也是與 c 語言一致,減少思維負擔與記憶負擔
if((a==1))
while((a==1))
for((i=0;i<5;i++))

# 規範五:如果想要通過通配符或者正則更靈活的判定條件的時候,我們才考慮換走 (()) 而使用 [[]]
if [[ $a=~\d{2,3} ]]

# 規範六:for 循環的編寫方式我們建議首先考慮的是如下:
for((i=0;i<5;i++))

# 規範七:能用 let 就不要使用 (()) 來表示原數字類型計算
a=1;
let "a++";
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章