shell很強(qiáng)大,shell很直接,shell很抽象
eval()
在.sh代碼中可以直接寫(xiě)命令。但在執(zhí)行過(guò)程中出錯(cuò)時(shí),欲將出錯(cuò)的命令(比如下面這句)自己手動(dòng)在command line執(zhí)行一次,就得打開(kāi)文件,找到那個(gè)命令,copy&paste到command line,執(zhí)行。
...
grep -e 'pattern' -r some/path
...
這有點(diǎn)煩。所以,我傾向于將所執(zhí)行的關(guān)鍵命令echo出來(lái),以在出錯(cuò)時(shí),即刻從console copy出來(lái)執(zhí)行。那就需要eval()了。即:先將命令存成一個(gè)變量,然后就可以eval()該變量來(lái)執(zhí)行命令(同時(shí)也可以echo出來(lái))。如下:
...
cmd="grep -e 'pattern' -r some/path"
echo $cmd // 程序穩(wěn)定了可以把這行注釋掉
eval($cmd)
...
$()
此方法可以將本應(yīng)輸出到stdout的內(nèi)容輸出到變量,以為后續(xù)程序所用
result=$(echo "hello")
// 此時(shí)result內(nèi)容即為"hello"
這個(gè)例子太簡(jiǎn)單,看起來(lái)$()沒(méi)什么用,但在實(shí)際中很有用。比如:你要檢查某個(gè)命令的輸出內(nèi)容中是否含有某個(gè)關(guān)鍵字。
result=$(grep -o -e 'pattern' -r some/path)
if [ $result = 'keyword'; ] then
// ok, found
else
// not found
fi
記?。?strong>輸出到stdout只能給人眼看,輸出到變量,才能被程序使用
2>&1
有時(shí),你需要將shell程序執(zhí)行輸出的log寫(xiě)入文件(以備后續(xù)排查問(wèn)題),你應(yīng)該知道這樣寫(xiě):
sh some/shell.sh > path/to/log
但這會(huì)漏掉STDERR,而他們是你定位bug的重要線索,可不能丟掉。所以,下面的寫(xiě)法才是正解:
sh some/shell.sh > path/to/log 2>&1
>> vs. >
下面寫(xiě)法為“追加”(即不清空已有內(nèi)容)
sh some/shell.sh >> path/to/log
下面寫(xiě)法則是先清空,再寫(xiě)
sh some/shell.sh > path/to/log
綜述
跟其他高級(jí)腳本語(yǔ)言相比(比如python),shell編程的優(yōu)勢(shì)在于:
- 無(wú)需安裝解釋器
- 所用命令絕大部分是我們?cè)赾ommand line天天用的,不生分
可以說(shuō),門(mén)檻比較低。作為程序猿,應(yīng)該學(xué)一下子。