背景
晚上幫一個(gè)朋友解決shell腳本的命令,好久沒有用shell腳本有點(diǎn)生疏。
所以我也跟著回顧了一些shell知識(shí)。
sed
sed 是一個(gè)流編輯器而不是一個(gè)替換的工具(我們 用得最多的就是其替換功能)。他的原理是讀取文件中的行存放到緩沖區(qū),接著用sed處理緩沖區(qū)的內(nèi)容,處理完成后把結(jié)果送到屏幕,所以文件內(nèi)容并沒有變。
sed 主要用來編輯多個(gè)文件簡化文件的反復(fù)操作用來轉(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 //原有的文件沒有被替換
I have a lot of books
shawndeMacBook-Pro:~ shawn$
sed命令具體參考:http://man.linuxde.net/sed
sed主要用于對于緩沖中的數(shù)據(jù)進(jìn)行,處理比如del、replace等等,還可以使用正則表達(dá)式。
awk
awk是一門編程語句,可以定義變量、數(shù)組、有運(yùn)算符、有控制語句比如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í)行過程中當(dāng)前行的文本內(nèi)容。
定義變量
redo=1
data_root_dir="$HOME/data/VOCdevkit"
1.等號(hào)兩遍不要有空格
2.引用一個(gè)變量需要帶$符號(hào),比如
一般情況下,$var 與 ${var} 并沒有啥不一樣。
但是用 ${ } 會(huì)比較精確的界定變量名稱的范圍,比方說:
$ A=B
$ echo $AB
原本是打算先將 $A 的結(jié)果替換出來,然后再補(bǔ)一個(gè) B 字母于其后,
但在命令行上,真正的結(jié)果卻是只會(huì)替換變量名稱為 AB 的值出來…
若使用 ${ } 就沒問題了:
3.定義數(shù)字不帶“”,定義字符串要帶“”號(hào)。
if語法
if [ $redo ]
then
extra_cmd="$extra_cmd --redo"
fi
for 命令語法
for subset in test trainval
do
...
done
dirname
截圖路徑的目錄部分
dirname
shawndeMacBook-Pro:~ shawn$ dirname /usr/bin/sort
/usr/bin
變量替換
$( ) 與 (反引號(hào)) 都是用來做命令替換用(command substitution)的。
所謂的命令替換與我們第五章學(xué)過的變量替換差不多,都是用來重組命令行:
$ echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)
-- 結(jié)果:
the last sunday is 2018-02-18
如此便可方便得到上一星期天的日期了… _
用 $( ) 的理由:
1, 很容易與 ' ' ( 單引號(hào))搞混亂,尤其對初學(xué)者來說。
有時(shí)在一些奇怪的字形顯示中,兩種符號(hào)是一模一樣的(直豎兩點(diǎn))。
2, 在多層次的復(fù)合替換中, 須要額外的跳脫( ` )處理,而 $( ) 則比較直觀。例如:
這是錯(cuò)的:
[code]command1 command2command3[/code]
原本的意圖是要在 command2 command3 先將 command3 提取出來給 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)果云
說在后面的話
由于代碼運(yùn)行結(jié)果依賴輸入數(shù)據(jù)且人很容易陷入扣代碼的細(xì)節(jié),所以我建議是把代碼日志輸出出來。根據(jù)輸入和輸出你能夠忽略細(xì)節(jié)最快的看代碼。從這一點(diǎn)上我們看源代碼不能只看不去運(yùn)行,帶著疑問要跑起查看運(yùn)行日志這會(huì)讓我們更加快速的開源軟件架構(gòu)和細(xì)節(jié)。