shell很強大,shell很直接彤委,shell很抽象
eval()
在.sh代碼中可以直接寫命令。但在執(zhí)行過程中出錯時,欲將出錯的命令(比如下面這句)自己手動在command line執(zhí)行一次皇拣,就得打開文件,找到那個命令薄嫡,copy&paste到command line氧急,執(zhí)行。
...
grep -e 'pattern' -r some/path
...
這有點煩毫深。所以吩坝,我傾向于將所執(zhí)行的關鍵命令echo出來,以在出錯時哑蔫,即刻從console copy出來執(zhí)行钉寝。那就需要eval()了。即:先將命令存成一個變量闸迷,然后就可以eval()該變量來執(zhí)行命令(同時也可以echo出來)嵌纲。如下:
...
cmd="grep -e 'pattern' -r some/path"
echo $cmd // 程序穩(wěn)定了可以把這行注釋掉
eval($cmd)
...
$()
此方法可以將本應輸出到stdout的內容輸出到變量,以為后續(xù)程序所用
result=$(echo "hello")
// 此時result內容即為"hello"
這個例子太簡單稿黍,看起來$()沒什么用疹瘦,但在實際中很有用。比如:你要檢查某個命令的輸出內容中是否含有某個關鍵字巡球。
result=$(grep -o -e 'pattern' -r some/path)
if [ $result = 'keyword'; ] then
// ok, found
else
// not found
fi
記籽糟濉:輸出到stdout只能給人眼看邓嘹,輸出到變量,才能被程序使用
2>&1
有時险胰,你需要將shell程序執(zhí)行輸出的log寫入文件(以備后續(xù)排查問題)汹押,你應該知道這樣寫:
sh some/shell.sh > path/to/log
但這會漏掉STDERR,而他們是你定位bug的重要線索起便,可不能丟掉棚贾。所以,下面的寫法才是正解:
sh some/shell.sh > path/to/log 2>&1
>> vs. >
下面寫法為“追加”(即不清空已有內容)
sh some/shell.sh >> path/to/log
下面寫法則是先清空榆综,再寫
sh some/shell.sh > path/to/log
綜述
跟其他高級腳本語言相比(比如python)妙痹,shell編程的優(yōu)勢在于:
- 無需安裝解釋器
- 所用命令絕大部分是我們在command line天天用的,不生分
可以說鼻疮,門檻比較低怯伊。作為程序猿,應該學一下子判沟。