1,Redirect Operators and File Descriptors
- &n redirect standard input from file descriptor n
- >&n redirect standard output to file descriptor n
- n<file redirect file descriptor n from file
- n>file redirect file descriptor n to file
- n>>file redirect file descriptor n to file. Create file if non-existent, else overwrite.
- n>| file redirect file descriptor n to file. Create file even if noclobber is enabled.
- n<&m redirect file descriptor n input from file descriptor m
- n>&m redirect file descriptor n output to file descriptor m
- n<>file open file for reading and writing as file descriptor n
- n<<word redirect to file descriptor n until word is read
- n<<-word redirect to file descriptor n until word is read; ignore leading tabs
- n<&- close file descriptor n for standard input
- n>&- close file descriptor n for standard output
- print &un args redirect arguments to file descriptor n. If n is greater than 2, it must first be opened with exec. If n is not specified, the default file descriptor argument is 1 (standard output).
- read &un args read input line from file descriptor n. If n is greater than 2, it must first be opened with exec. If n is not specified, the default file descriptor argument is 0 (standard input).
2, echo知多少?
echo常用选项有:
-e :啟用反斜線控制字符的轉換(參考下表)
-E:關閉反斜線控制字符的轉換(預設如此)
-n :取消行末之換行符號(與 -e 選項下的 /c 字符同意)
關於 echo 命令所支援的反斜線控制字符如下表:
/a:ALERT / BELL (從系統喇叭送出鈴聲)
/b:BACKSPACE ,也就是向左刪除鍵
/c:取消行末之換行符號
/E:ESCAPE,跳脫鍵
/f:FORMFEED,換頁字符
/n:NEWLINE,換行字符
/r:RETURN,回車鍵
/t:TAB,表格跳位鍵
/v:VERTICAL TAB,垂直表格跳位鍵
/n:ASCII 八進位編碼(以 x 開首為十六進位)
//:反斜線本身
(表格資料來自 O'Reilly 出版社之 Learning the Bash Shell, 2nd Ed.)
eg,
- $ echo -ne "a/tb/tc/nd/te/bf/a"
- a b c
- d f $
解释:
因為 e 字母後面是刪除鍵(/b),因此輸出結果就沒有 e 了。
在結束時聽到一聲鈴嚮,那是 /a 的傑作﹗
由於同時使用了 -n 選項,因此 shell prompt 緊接在第二行之後。
若你不用 -n 的話,那你在 /a 後再加個 /c ,也是同樣的效果。
3,shell文字类别:'' ""之分(http://bbs.chinaunix.net/viewthread.php?tid=218853&extra=&page=4)
command line 的每一個 charactor ,分為如下兩種:
* literal:也就是普通純文字,對 shell 來說沒特殊功能。
* meta:對 shell 來說,具有特定功能的特殊保留字元。
我們在 command line 中已碰到兩個機乎每次都會碰到的 meta :
* IFS:由 <space> 或 <tab> 或 <enter> 三者之一組成(我們常用 space )。
* CR:由 <enter> 產生。
IFS 是用來拆解 command line 的每一個詞(word)用的,因為 shell command line 是按詞來處理的。
而 CR 則是用來結束 command line 用的,這也是為何我們敲 <enter> 命令就會跑的原因。
除了 IFS 與 CR ,常用的 meta 還有:
= : 設定變量。
$ : 作變量或運算替換(請不要與 shell prompt 搞混了)。
> :重導向 stdout。
< :重導向 stdin。
|:命令管線。
& :重導向 file descriptor ,或將命令置於背境執行。
( ):將其內的命令置於 nested subshell 執行,或用於運算或命令替換。
{ }:將其內的命令置於 non-named function 中執行,或用在變量替換的界定範圍。
; :在前一個命令結束時,而忽略其返回值,繼續執行下一個命令。
&& :在前一個命令結束時,若返回值為 true,繼續執行下一個命令。
|| :在前一個命令結束時,若返回值為 false,繼續執行下一個命令。
!:執行 history 列表中的命令
假如我們需要在 command line 中將這些保留字元的功能關閉的話,就需要 quoting 處理了。
在 bash 中,常用的 quoting 有如下三種方法:
* hard quote:' ' (單引號),凡在 hard quote 中的所有 meta 均被關閉。
* soft quote: " " (雙引號),在 soft quoe 中大部份 meta 都會被關閉,但某些則保留(如 $ )。(註二)
* escape : / (反斜線),只有緊接在 escape (跳脫字符)之後的單一 meta 才被關閉。
( 註二:在 soft quote 中被豁免的具體 meta 清單,我不完全知道
shell中编译,IFS:
上面的 IFS=; 其實就是:
IFS=
將值設為 null
然後補一個" ; " 的 meta ...
昨晚的文章,一開始就提到 IFS 的作用了:
是 breaks command line down to each word 用的...
而 command line 則是 processes word by word 進行的,
若碰到 meta 或 key words ,會先處理之,等到所有的 words 都處理完畢,
那才開始傳給 shell 處理...
man bash 在 Special Parameters 那節有提到:
Expands to the positional parameters, starting from
one. When the expansion occurs within double
quotes, it expands to a single word with the value
of each parameter separated by the first character
of the IFS special variable. That is, "$*" is
equivalent to "$1c$2c...", where c is the first
character of the value of the IFS variable. If IFS
is unset, the parameters are separated by spaces.
If IFS is null, the parameters are joined without
intervening separators.
我要先消化一下....
shell meta Vs command meta:
前面我們提到的那些 meta ,都是在 command line 中有特殊用途的,
比方說 { } 是將其內一系列 command line 置於不具名的函式中執行(可簡單視為 command block ),
但是,awk 卻需要用 { } 來區分出 awk 的命令區段(BEGIN, MAIN, END)。
若你在 command line 中如此輸入:
$ awk {print $0} 1.txt
由於 { } 在 shell 中並沒關閉,那 shell 就將 {print $0} 視為 command block ,
但同時又沒有" ; "符號作命令區隔,因此就出現 awk 的語法錯誤結果。
要解決之,可用 hard quote :
$ awk '{print $0}' 1.txt
上面的 hard quote 應好理解,就是將原本的 {、<space>、$(註三)、} 這幾個 shell meta 關閉,
避免掉在 shell 中遭到處理,而完整的成為 awk 參數中的 command meta 。
( 註三:而其中的 $0 是 awk 內建的 field number ,而非 awk 的變量,
awk 自身的變量無需使用 $ 。)