文章目錄
- 4.1 重新導向與管道
- tr 命令詳解
- 4.2 特殊檔案:/dev/null 與 /dev/tty
1 變數
Shell 變數名稱的開頭是一個字母或底線符號,後面可以接著任意長度的字母、數字或底線符號。
Shell 變數名稱的字元長度並無限制。
Shell 變數可以用來儲存字串值,所能儲存的字元數同樣沒有限制。
變數的賦值方式為:先寫變數名稱,緊接著 = 字元,最後是新值,中間完全沒有任何空格。當你想取出 Shell 變數的值時,需於變數名稱前面加 $ 字元。當所賦予的值內含空格時,請加上引號:
first=isaac middle=bashevis last=singer #單行可進行多次賦值fullname="isaac bashevis singer" #值中包含空格時使用引號oldname=$fullname #此處不需要引號
不過,當你將幾個變數串連起來時,就需要使用引號了:
fullname="$first $middle $last" #這裡需要雙引號
2 簡單的 echo 輸出
$ echo Now is the time for all good menNow is the time for all good men
3 華麗的 printf 輸出
printf 命令模仿 C 程式庫裡的 printf() 程式。它幾乎複製了該函數所有的功能,如果你曾使用C、C++、awk、Perl、Python 或 Tcl 寫過程式,對它的基本概念應該不陌生。當然,它在 Shell 層級的版本上,會有些差異。
如同 echo 命令, printf 命令可以輸出簡單的字串:
printf "hello, world\n"
printf 不像 echo 那樣會自動提供一個分行符號號。你必須顯示地將分行符號號指定成 \n 。printf 命令的完整文法分為兩部分:
printf format-string [arguments ...]
第一部分(format-string)是一個字串,用來描述輸出的相片順序,最好為此字串加上引號。此字串包含了按字面顯示的字元以及格式聲明,後者是特殊的預留位置,用來描述如何顯示相應的參數。格式聲明分成兩部分:百分比符號(%)和指示符。最常用的格式指示符有兩個,%s 用於字串,而 %d 用於十進位整數。
第二部分(arguments ...)是與格式聲明想對應的參數列表。
格式字串中,一般字元會按字面顯示,逸出序列則解釋後再輸出成相應的字元。格式什麼以 % 符號開頭,並以定義的字母集中的一個字元來結束,用來控制相應參數的輸出。例如,%s 使用者字串的輸出:
$ printf "The first program always prints '%s, %s!'\n" Hello worldThe first program always prints 'Hello world!'
4 基本的 I/O 重新導向4.1 重新導向與管道
Shell 提供了數種文法標記,可以用來改變預設 I/O 的來源端與目的端。
* 以 < 改變標準輸入
program < file 可將 program 的標準輸入修改為 file:
tr -d '\r' < dos-file.txt
* 以 > 改變標準輸出
program > file 可將 program 的標準輸出修改為 file:
tr -d '\r' < dos-file.txt > UNIX-file.txt
這條命令會先以 tr 將 dos-file.txt 裡的 ASCII 斷行符號刪除,再將轉換完成的資料輸出到 UNIX-file.txt。(dos-file.txt 裡的未經處理資料不會有變化)。
> 重新導向符在目的檔案不存在時,會建立一個。然而,如果目的檔案已存在,它就會被覆蓋掉;原本的資料都會丟失。
* 以 >> 附加到檔案
program >> file 可將 program 的標準輸出附加到 file 的結尾處。
如同 >,如果目的檔案不存在,>>重新導向符便會建立一個。然而,如果目的檔案存在,它不會直接覆蓋掉檔案,而是將程式所產生的資料附加到檔案結尾處:
for f in dos-file*.txtdo tr -d '\r' < $f >> big-UNIX-file.txtdone
* 以 | 建立管道
program1 | program2 可將 program1 的標準輸出修改為 program2 的標準輸入。
tr -d '\r' < dos-file.txt | sort > UNIX-file.txt
tr 命令詳解
文法
tr [ options ] source-char-list replace-char-list
用途
轉換字元。例如,將大寫字元轉換成小寫。選項可讓你指定要刪除的字元,以及將一串重複出現的字元濃縮成一個。
常用選項
- c
取 source-char-list 的反義。tr 要轉換的字元,變成未列在 source-char-list 中的字元。此選項通常與 -d 或 -s 配合使用。
- C
與 -c 相似,但所處理的是字元(可能是包含多個位元組的寬字元),而非二進位的位元組值。
-d
自標準輸入刪除 source-char-list 裡所列的字元,而不是轉換它們。
-s
濃縮重複的字元。如果標準輸入中連續重複出現 source-char-list 裡的所列的字元,則將其濃縮成一個。
行為模式
如同過濾器:自標準輸入讀取字元,再將結果寫到標準輸出。任何輸入字元只要出現在 source-char-list 中,就會置換成 replace-char-list 裡相應的字元。POSIX 風格的字元與等效的字元集也適用,而且 tr 還支援 replace-char-list 中重複字元的標記法。
警告
根據 POSIX 標準的定義,-c 處理的是二進位位元組值,而 -C 處理的是現行 locale 所定義的字元。
4.2 特殊檔案:/dev/null 與 /dev/tty
UNIX 系統提供了兩個對 Shell 編程特別有用的特殊檔案。第一個檔案 /dev/null,就是大家所熟知的位桶(bit bucket)。傳說到此檔案的資料都會被系統丟掉。也就是說,當程式將資料寫到此檔案時,會認為它已經成功完成寫入資料的操作,但實際上什麼事都沒做。如果你需要的是命令的退出狀態,而非它的輸出,次功能會很有用。例如,測試一個檔案是否包含某個模式:
if grep patten myfile > /dev/nullthen ... #找到模式時else ... #找不到模式時fi
相對地,讀取 /dev/null 則會立即返迴文件結束符號。讀取 /dev/null 的操作很少會出現在 Shell 程式裡,不過瞭解這個檔案的行為模式還是非常重要的。
另一個特殊檔案為 /dev/tty 。當程式開啟此檔案時,UNIX 會自動將它重新導向到一個終端 [ 一個實體的控制台或序列埠,也可能是一個通過網路與視窗登入的偽終端 ] 再也程式結合。這在程式必須讀取人工輸入時(例如密碼)特別有用。此外,用它來產生錯誤資訊也很方便,只是比較少人這麼做:
printf "Enter new password: " #提示輸入stty -echo #關閉自動列印輸入字元的功能read pass < /dev/tty #讀取密碼printf "Enter again: " #提示再輸入一次read pass2 < /dev/tty #再讀取一次以確認stty echo #別忘了開啟自動列印輸入字元的功能#...
stty 命令用來控制終端的各種設定。 -echo 選項用來關閉自動列印每個輸入字元的功能;stty echo 用來恢複該功能。
參考:<<Shell 指令碼學習指南>>