標籤:
Shell指令:
shell識別三種基本命令:內建命令、Shell函數以及外部命令:
內建命令就是由shell本身所執行的命令。有些命令是由於其必要性才內建的;例如:cd、read; 另一種內建命令的存在則是為了效率,其中最典型的就是test命令(稍後有介紹),編寫指令碼時會經常用到它。另外還有I/O命令。例如echo 和 printf。
Shell函數是功能健全的一系列程式碼,以Shell語言寫成,它們可以像命令那樣引用,稍後也有介紹;
外部命令就是由Shell的副本(新的進程)所執行的命令,基本過程如下:
a、建立一個新的進程。此進程即為Shell的一個副本。
b、在新的進程裡,在PATH變數內所列出的目錄中,尋找特定的命令。 /bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin為PATH變數典型的預設值。當命令名稱含有斜杠(/)符時,將掠過路徑尋找步驟;
c、在新的進程裡,以所找到的新程式取代執行中的Shell程式並執行。
d、程式完成後,最初的Shell會接著從終端讀取的下一條命令,或執行指令碼裡的下一條命令;
變數:
在Shell的世界裡,變數值可以是(而且通常是)空值,也就是不含任何字元。這是合理的,也是常見的,好用的特性。空值就是null;
Shell變數名稱的開頭是一個字母或底線符號,後面可以接著任意長度的字母、數字或底線符號。變數名稱的字元長度並無限制。
注意:
變量賦值的方式為:先寫變數名稱,緊接著=字元,最後是新值,中間完全沒有任何空格(這點於C/C++很大區別)。 當要取出shell變數的值時,需於變數名稱前面加上$字元。當所賦值的值內含空格時,請加上引號;
first=isaac middle=bashevis last=singer
fullname="isaac bashevis singer"; //等號左右兩邊都沒有空格
oldname=$fullname; //此處要加上$符
fullname="$firsh $middle $last"; //將幾個變數串連起來,要加上雙引號
華麗的printf輸出:
printf命令模仿C程式庫(library)裡的printf()庫程式(library routine)。它幾乎複製了該函數的所有的功能;
printf "hello world"
printf不像echo那樣會自動提供一個換行的符號。你必須顯式地將分行符號指定成\n 。 printf命令的完整文法分為兩部分:
printf format-string [arguments .......]
$printf "The first program always prints ‘%s, %s ! ‘\n " Hello world
The first program always prints ‘Hello, world !‘
基本的I/O重新導向以及重新導向與管道
標準輸入/輸出被稱為:標準輸入、標準輸出、以及標準錯誤輸出;
樣本:等登入shell時,UNIX便將預設的標準輸入、輸出以及錯誤輸出安排成你的終端。I/O重新導向就是通過與終端互動,或是在shell指令碼裡設定
重新安排從哪裡輸入或輸出到哪裡;
以 < 改變標準輸入
program < file 可將program的標準輸入改為file;
以 > 改變標準輸出
program > file 可將program的標準輸出修改為file;
> 重新導向符在目標檔案不存在時,會建立一個。然而,如果目標檔案已存在,它就會被覆蓋掉,原本的資料都會丟失;
以 >> 附加到檔案;
program >> file
如果目標檔案不存在, >>重新導向符便會建立一個。如果目標檔案存在,它不會直接覆蓋掉檔案,而是將程式所產生的資料附加到檔案結尾處;
以 | 建立管道:
program1 | program2
將program1的標準輸出作為program2的標準輸入。雖然< 和 > 可將輸入與輸出串連到檔案,但管道可以使得執行速度比使用臨時檔案的程式塊10倍以上;
特殊檔案:/dev/null 與 /dev/tty
unix系統提供了兩個對shell編程特別有用的特殊檔案。第一個檔案/dev/null, 就是大家熟知的位桶(bit bucket)。傳送到此檔案的資料都被系統丟掉。也就是說,當程式將資料寫到此檔案時,會認為它已成功完成寫入資料的操作,但實際上什麼事都沒做。如果需要的是命令的退出狀態。而非它的輸出,此功能會很有用。例如,測試一個檔案是否包含某個模式:
if grep pattern myfile > /dev/null
then
.... //找到模式
else
.... // 找不到模式時
fi
相對地,讀取/dev/null則會立即返迴文件結束符號。讀取/dev/null的操作很少會出現在Shell程式裡,不過瞭解這個檔案的行為模式還是非常重要的;
另一個特殊檔案為/dev/tty。 當程式開啟此檔案時,unix會自動將他重新導向到一個終端【一個實體控制台或者串口】,也可能是通過網路與視窗登入的偽終端再與程式結合。這在程式必須讀取人工輸入是特別有用;
Shell基礎一