深入理解Bash中的尖括號(適合初學者)
前言
Bash 內(nèi)置了很多諸如 ls、cd、mv 這樣的重要的命令,也有很多諸如 grep、awk、sed 這些有用的工具。但除此之外,其實 Bash 中還有很多可以起到膠水作用的標點符號,例如點號(.)、逗號(,)、括號(<>)、引號(")之類。下面我們就來看一下可以用來進行數(shù)據(jù)轉(zhuǎn)換和轉(zhuǎn)移的尖括號(<>)。
轉(zhuǎn)移數(shù)據(jù)
如果你對其它編程語言有所了解,你會知道尖括號 < 和 > 一般是作為邏輯運算符,用來比較兩個值之間的大小關(guān)系。如果你還編寫 HTML,尖括號作為各種標簽的一部分,就更不會讓你感到陌生了。
在 shell 腳本語言中,尖括號可以將數(shù)據(jù)從一個地方轉(zhuǎn)移到另一個地方。例如可以這樣把數(shù)據(jù)存放到一個文件當中:
ls > dir_content.txt
在上面的例子中,> 符號讓 shell 將 ls 命令的輸出結(jié)果寫入到 dir_content.txt 里,而不是直接顯示在命令行中。需要注意的是,如果 dir_content.txt 這個文件不存在,Bash 會為你創(chuàng)建;但是如果 dir_content.txt 是一個已有的非空文件,它的內(nèi)容就會被覆蓋掉。所以執(zhí)行類似的操作之前務(wù)必謹慎。
你也可以不使用 > 而使用 >>,這樣就可以把新的數(shù)據(jù)追加到文件的末端而不會覆蓋掉文件中已有的數(shù)據(jù)了。例如:
ls $HOME > dir_content.txt; wc -l dir_content.txt >> dir_content.txt
在這串命令里,首先將家目錄的內(nèi)容寫入到 dir_content.txt 文件中,然后使用 wc -l 計算出 dir_content.txt 文件的行數(shù)(也就是家目錄中的文件數(shù))并追加到 dir_content.txt 的末尾。
在我的機器上執(zhí)行上述命令之后,dir_content.txt 的內(nèi)容會是以下這樣:
Applications
bin
cloud
Desktop
Documents
Downloads
Games
ISOs
lib
logs
Music
OpenSCAD
Pictures
Public
Templates
test_dir
Videos
17 dir_content.txt
你可以將 > 和 >> 作為箭頭來理解。當然,這個箭頭的指向也可以反過來。例如,Coen brothers (LCTT 譯注:科恩兄弟,一個美國電影導演組合)的一些演員以及他們出演電影的次數(shù)保存在 CBActors 文件中,就像這樣:
John Goodman 5
John Turturro 3
George Clooney 2
Frances McDormand 6
Steve Buscemi 5
Jon Polito 4
Tony Shalhoub 3
James Gandolfini 1
你可以執(zhí)行這樣的命令:
sort < CBActors Frances McDormand 6 # 你會得到這樣的輸出 George Clooney 2 James Gandolfini 1 John Goodman 5 John Turturro 3 Jon Polito 4 Steve Buscemi 5 Tony Shalhoub 3
就可以使用 sort 命令將這個列表按照字母順序輸出。但是,sort 命令本來就可以接受傳入一個文件,因此在這里使用 < 會略顯多余,直接執(zhí)行 sort CBActors 就可以得到期望的結(jié)果。
如果你想知道 Coens 最喜歡的演員是誰,你可以這樣操作。首先:
while read name surname films; do echo $films $name $surname > filmsfirst.txt; done < CBActors
上面這串命令寫在多行中可能會比較易讀:
while read name surname films;\ do echo $films $name $surname >> filmsfirst;\ done < CBActors
下面來分析一下這些命令做了什么:
- while …; do … done 是一個循環(huán)結(jié)構(gòu)。當 while 后面的條件成立時,do 和 done 之間的部分會一直重復(fù)執(zhí)行;
- read 語句會按行讀入內(nèi)容。read 會從標準輸入中持續(xù)讀入,直到?jīng)]有內(nèi)容可讀入;
- CBActors 文件的內(nèi)容會通過 < 從標準輸入中讀入,因此 while 循環(huán)會將 CBActors 文件逐行完整讀入;
- read 命令可以按照空格將每一行內(nèi)容劃分為三個字段,然后分別將這三個字段賦值給 name、surname 和 films 三個變量,這樣就可以很方便地通過 echo $films $name $surname >> filmsfirst;\ 來重新排列幾個字段的放置順序并存放到 filmfirst 文件里面了。
執(zhí)行完以后,查看 filmsfirst 文件,內(nèi)容會是這樣的:
5 John Goodman
3 John Turturro
2 George Clooney
6 Frances McDormand
5 Steve Buscemi
4 Jon Polito
3 Tony Shalhoub
1 James Gandolfini
這時候再使用 sort 命令:
sort -r filmsfirst
就可以看到 Coens 最喜歡的演員是 Frances McDormand 了。(-r 參數(shù)表示降序排列,因此 McDormand 會排在最前面)
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
CentOS安裝Python2.7與Python2.6并存的方法
這篇文章主要介紹了CentOS安裝Python2.7與Python2.6并存的方法,非常具有實用價值,需要的朋友可以參考下2017-08-08淺談Linux系統(tǒng)中的異常堆棧跟蹤的簡單實現(xiàn)
下面小編就為大家?guī)硪黄獪\談Linux系統(tǒng)中的異常堆棧跟蹤的簡單實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12基于Nginx0.8.54+PHP5.3.4+MySQL5.5.8的全新LNMP穩(wěn)定版架構(gòu)搭建的VPS
經(jīng)過幾個小時的編譯安裝配置,基于Nginx0.8.54+PHP5.3.4+MySQL5.5.8的全新LNMP穩(wěn)定版架構(gòu)搭建的VPS終于穩(wěn)定運行。2010-12-12CentOS 7.2.1511 編譯安裝Nginx1.10.1+MySQL5.6.33+PHP5.6.26運行環(huán)境
這篇文章主要介紹了CentOS 7.2.1511 編譯安裝Nginx1.10.1+MySQL5.6.33+PHP5.6.26運行環(huán)境,需要的朋友可以參考下2016-10-10