背景
晚上幫一個(gè)朋友解決shell腳本的命令祠够,好久沒(méi)有用shell腳本有點(diǎn)生疏萍肆。
所以我也跟著回顧了一些shell知識(shí)。
sed
sed 是一個(gè)流編輯器而不是一個(gè)替換的工具(我們 用得最多的就是其替換功能)。他的原理是讀取文件中的行存放到緩沖區(qū)靴寂,接著用sed處理緩沖區(qū)的內(nèi)容,處理完成后把結(jié)果送到屏幕召耘,所以文件內(nèi)容并沒(méi)有變百炬。
sed 主要用來(lái)編輯多個(gè)文件簡(jiǎn)化文件的反復(fù)操作用來(lái)轉(zhuǎn)換程序。
shawndeMacBook-Pro:~ shawn$ cat seddemo.txt
I have a lot of books
shawndeMacBook-Pro:~ shawn$ sed 's/book/books/' seddemo.txt
I have a lot of bookss
shawndeMacBook-Pro:~ shawn$ cat seddemo.txt //原有的文件沒(méi)有被替換
I have a lot of books
shawndeMacBook-Pro:~ shawn$
sed命令具體參考:http://man.linuxde.net/sed
sed主要用于對(duì)于緩沖中的數(shù)據(jù)進(jìn)行污它,處理比如del剖踊、replace等等,還可以使用正則表達(dá)式衫贬。
awk
awk是一門編程語(yǔ)句德澈,可以定義變量、數(shù)組固惯、有運(yùn)算符梆造、有控制語(yǔ)句比如for循環(huán)等。
awk工作原理參考:
http://man.linuxde.net/awk#awk的工作原理葬毫,具體步驟是
1).定義頭部BEGIN{}
2).pattern,讀取文件每一行澳窑,進(jìn)行轉(zhuǎn)換輸出。//注意在pattern中才開始遍歷循環(huán)
3).end{}輸出尾部供常。
由于頭部,pattern鸡捐,尾部經(jīng)常用于輸出類似表格的格式化數(shù)據(jù)栈暇。
cat test.csv | awk -F"," '{print $2,$3}' ----------------我習(xí)慣與用管道如此寫:
//$n 當(dāng)前記錄的第n個(gè)字段,比如n為1表示第一個(gè)字段箍镜,n為2表示第二個(gè)字段源祈。 $0 //這個(gè)變量包含執(zhí)行過(guò)程中當(dāng)前行的文本內(nèi)容。
定義變量
redo=1
data_root_dir="$HOME/data/VOCdevkit"
1.等號(hào)兩遍不要有空格
2.引用一個(gè)變量需要帶$符號(hào)色迂,比如
一般情況下香缺,$var 與 ${var} 并沒(méi)有啥不一樣。
但是用 ${ } 會(huì)比較精確的界定變量名稱的范圍歇僧,比方說(shuō):
$ A=B
$ echo $AB
原本是打算先將 $A 的結(jié)果替換出來(lái)图张,然后再補(bǔ)一個(gè) B 字母于其后,
但在命令行上诈悍,真正的結(jié)果卻是只會(huì)替換變量名稱為 AB 的值出來(lái)…
若使用 ${ } 就沒(méi)問(wèn)題了:
3.定義數(shù)字不帶“”祸轮,定義字符串要帶“”號(hào)。
if語(yǔ)法
if [ $redo ]
then
extra_cmd="$extra_cmd --redo"
fi
for 命令語(yǔ)法
for subset in test trainval
do
...
done
dirname
截圖路徑的目錄部分
dirname
shawndeMacBook-Pro:~ shawn$ dirname /usr/bin/sort
/usr/bin
變量替換
$( ) 與 (反引號(hào)) 都是用來(lái)做命令替換用(command substitution)的侥钳。
所謂的命令替換與我們第五章學(xué)過(guò)的變量替換差不多适袜,都是用來(lái)重組命令行:
$ echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)
-- 結(jié)果:
the last sunday is 2018-02-18
如此便可方便得到上一星期天的日期了… _
用 $( ) 的理由:
1, 很容易與 ' ' ( 單引號(hào))搞混亂,尤其對(duì)初學(xué)者來(lái)說(shuō)舷夺。
有時(shí)在一些奇怪的字形顯示中苦酱,兩種符號(hào)是一模一樣的(直豎兩點(diǎn))售貌。
2, 在多層次的復(fù)合替換中, 須要額外的跳脫( ` )處理疫萤,而 $( ) 則比較直觀颂跨。例如:
這是錯(cuò)的:
[code]command1 command2
command3[/code]
原本的意圖是要在 command2 command3
先將 command3 提取出來(lái)給 command 2 處理。
pwd1=$(ls ./)
shawndeMacBook-Pro:~ shawn$ echo $(pwd1) //$()里必須是command
-bash: pwd1: command not found
shawndeMacBook-Pro:~ shawn$ echo ${pwd1}
Applications Applications (Parallels) ...... 我的堅(jiān)果云
說(shuō)在后面的話
由于代碼運(yùn)行結(jié)果依賴輸入數(shù)據(jù)且人很容易陷入扣代碼的細(xì)節(jié)给僵,所以我建議是把代碼日志輸出出來(lái)毫捣。根據(jù)輸入和輸出你能夠忽略細(xì)節(jié)最快的看代碼。從這一點(diǎn)上我們看源代碼不能只看不去運(yùn)行帝际,帶著疑問(wèn)要跑起查看運(yùn)行日志這會(huì)讓我們更加快速的開源軟件架構(gòu)和細(xì)節(jié)蔓同。