總結了一些shell編程初學者常犯的錯誤、注意事項及技巧:
1.判斷變量是否加$:
(1)賦值變量時不加$
(2)如果命令能識別變量就不加$,如果命令不能識別變量加$
2.存放多行字符時”$name”變量外加雙引號可保留換行格式
3.{}和()中執行命令的區別:
()中使用的命令為一次性的,小括號中相當于在子進程中執行命令,小括號繼承括號外變量,但不會影響括號外變量
注:小括號中所說的子進程與常規的子進程不是一回事
而{ }中使用命令是在當前shell環境中執行,不會不開啟子進程,會影響當前shell環境
例1:x=1;echo $$;(echo $$;echo $x;x=2);echo $x
雖然括號內開啟了一個子進程,但該子進程號和括號外進程號一致;此外括號外變量會影響括號內,但括號內變量更改不會影響括號外。
例2:(echo $$;exit)
執行此命令,顯示當前所在進程號,exit退出()內子進程
{ }中使用命令是在當前shell環境中執行,不會不開啟子進程,會影響當前shell環境
例3:x=1;echo $$;{ echo $$;echo $x;x=2; };echo $x
{}內命令相當于當前shell執行,因此括號外和括號內進程號一致,此外{}內變量影響了{}外的變量。
例4:{ ?echo$$;exit; ?}
執行此命令,顯示當前所在進程號,exit退出當前shell;
因此編寫腳本時,想要使用括號利用exit命令退出腳本,一定要使用{},而不能使用()
4.短路與&&和短路或||嵌套連續命令時可使用大括號
如&&{ ?cmd1 ;cmd2 ; };||{ ?cmd1 ;cmd2 ;};
測試或命令結果為假時,后跟連續多條命令,必須需采用此種格式:
false || { echo cmd1 ; echo cmd2 ; }
表示測試或命令返回false時,執行cmd1,cmd2
測試或命令結果為真時,后跟連續多條命令,可寫為:
true && echo cmd1 && echo cmd2
也可寫為:
true && { echo cmd1 ; echo cmd2 ; }
當條件測試或命令后同時出現短路且&&與短路或||有嵌套命令的情況時:
如:[ Test ] && { echo cmd1 ; echo cmd2 ; } || { echo cmd3; echo cmd4 ; }
表示當Test為真時,執行命令cmd1,cmd2;當Test為假時,執行cmd3,cmd4;
5.引用超過10個以上的位置變量時,數字加{};如$10要寫為${10}
不加{}時,默認將$10當作$1和0表示出來:
當給10加上大括號后,${10}才表示第10個位置變量:
6.位置變量$*與$@的區別
兩者都可表示傳遞給腳本的所有參數,但$*將每個參數合并為一個字符串;
而$@每個參數作為獨立字符
注意:$@、$*只在被雙引號包起來的時候才會有差異。
7.在使用[? ]和test引用變量時,最好加雙引號””避免出問題
不加引號也許不會出錯,但加上引號肯定不會有錯
8.腳本中進行變量的算術運算時,有空格盡量刪除
變量的算術運算,多一個空格就會導致出錯,所以盡量將空格刪除
9.進行條件測試過程中,能加空格地方盡量都加空格
條件測試時,無論是括號兩端還是字符兩端少一個空格就會導致出錯,所有盡量都加空格
10.使用=~進行PATTERN匹配時,需要加雙括號[[ ]],且正則表達式不能加引號,默認使用擴展正則表達式
正則表達式加引號就會導致錯誤結果,這與我們在使用grep與sed等命令利用到正則表達式需要加引號正好相反,需要注意
11.用于字符串比較時的用到的操作應該都使用引號
同上,不加引號也許不會出錯,但加上引號肯定不會有錯
12.[[? == ]]右側可匹配類似于通配符glob的用法
此種匹配類似于通配符,但不完全等同于通配符,注意格式雙中括號,雙等號 [[ == ]]
13.腳本里不支持別名
14.文件測試后跟空字符時,也反饋為True。
例如:/data/fstab為普通文件,用-f選項判斷時,后跟fstab文件或者空時都判斷為真
因此要保證一個文件存在且滿足測試條件時,
可表示為:[ -n ?“file” ?-a ?–f ?“file” ]
file文件是否存在且為普通文件
15.測試字符串是否為空除了-z及-n選項,還可用[ ?“$var” ?= ?“” ?];[ ?x”$var” ?= ?“x” ?]來測試。
例1:當$var為空時,使用[ ?“$var” ?= ?“” ?]返回結果0
例2:當$var為空時,[ ?x”$var” ?= ?“x” ?]返回結果為0
16.養成好習慣:變量一使用完后就用unset刪掉。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/95882
封面很花哨,(手動滑稽 :p