標籤:名稱 dev linux系統 blog echo 核心 環境 應該 變數賦值
由於我平時的工作環境是linux,所以無可避免的經常使用命令列模式和shell指令碼,而且有些命令列每天都要輸好多遍,比如ssh登入之類的,所以乾脆把平時常用的命令都寫成指令檔,所以特意開了一個shell指令碼的分類,用來記錄學習shell的過程,以便溫習。
- 首先我們從一個簡單的指令碼來開啟shell學習的大門,假設你想要知道當前系統中有多少人登入,可以使用 who 命令來查詢:
1 $ who2 george pts/2 Dec 31 16:393 betsy pts/3 Dec 27 11:07
- 但如果在多使用者系統上資訊量會很大,在統計時很麻煩,所以我們可以使用通道和wc 程式來統計行數(line)、字數(word)與字元數(character),本例中為統計登入人數所以查詢行數即可。
1 $ who | wc -l2 2
- 注意:| (管道)符號可以在兩個程式之間建立管道:即who 的輸出變成了wc 的輸入
- 接下來就可以將其轉變為一個小型的指令檔,將上述命令寫入一個一般文字檔中,然後賦予執行許可權執行即可,這也展現了指令檔的開發週期,可以先在命令列進行測試開發,無誤後寫入檔案.
1 $ vi wc.sh2 #進入文本編輯模式,將命令who | wc -l寫入,儲存退出3 $ chmod +x wc.sh #賦予該指令檔執行許可權4 $ ./wc.sh #執行指令碼5 $ 2 #獲得輸出結果
- 在很多指令碼的第一行都會有#! 這兩個字元,這兩個字元的含義是告知linux核心應該以哪種shell來執行當前指令碼,當前大多數指令碼都是使用#!/bin/sh ,也有使用#!/bin/csh (是C shell的解譯器)
1 $ cat wc.sh2 3 #!/bin/sh4 who | wc -l
- 分號; 可用來分割同一行裡的多條命令,Shell會依次執行的,如果使用了& 符號,則代表當前命令是後台執行,即不需要等到當前命令執行完畢就可以繼續執行下一條命令
- 變數:Shell變數的名稱的開頭是一個字母或者底線符號,後面可以接任意長度的字母、數字和底線符號,並且變數長度沒有限制;變數賦值的方式為:先寫變數名稱,緊接著= 字元,最後是賦予的值,中間沒有空格,當你想取用變數的值則需要在變數的名稱前使用$ 字元。
1 $ value=this_is_a_long_value #當賦予的值中存在空格時,需要引號括起來2 $ echo $value3 $ this_is_a_long_value
- 輸出命令:大多數人可能習慣使用echo命令來進行簡單的輸出,但要知道echo是由版本差異的,所以移植是一個可能存在風險的問題,相對來看,還是比較推薦使用printf命令,printf命令幾乎完全把c裡的printfcopy下來,所以c中的格式化字元也同樣適用的。
1 $ printf "hello world.\n" # printf不會像echo那樣隱式添加一個分行符號,所以需要手動添加分行符號\n2 $ printf “The first program always prints %s %s.\n” Hello World
- 重新導向:以< 改變標準輸入,以 > 改變標準輸出
1 program < file 可以將program的標準輸入修改為file2 eg. tr -d ‘\r’ < test.file #這條命令會將test.file檔案中的斷行符號符刪除掉3 4 program > file 可以將program的標準輸出修改為file5 eg. tr -d ‘\r’ < test.file > result.file #這條命令會先將test.file中的斷行符號刪除,再將處理完的資料輸出到result.file中,但test.file中的資料不會發生改變6 7 #注意:> 重新導向符在目的檔案不存在時會自動建立一個,如果檔案已存在則會覆蓋原有資料,如果希望追加資料,則需要使用 >> 重新導向符
1 program1 | program2 #program2可以將program1的標準輸出作為自己的輸入
特殊檔案 /dev/null 和/dev/tty
1 #linux系統提供了兩個對Shell編程特別有用的特殊檔案 2 #/dev/null檔案 3 #該檔案一般被稱為位桶。傳送到此檔案中的資料都會被系統丟掉,也就是說當程式將資料寫入次檔案時,從結果上看已經成功寫入資料了,但實際上卻什麼事都沒做 4 #例如測試一個檔案是否包含某個模式 5 if grep pattern myfile > /dev/null 6 then 7 printf “find.” 8 else 9 printf ”don’t find”10 fi11 12 #/dev/tty13 #當程式開啟此檔案時,Linux會自動將它重新導向到一個終端再與程式結合14 eg.printf “Enter new passed:” #提示輸入新密碼15 stty -echo #關閉自動列印輸入字元的功能16 read pass < /dev/tty #從當前終端讀取密碼17 printf “Enter again:” #再次輸入密碼18 read pass2 < /dev/tty19 stty echo #開啟自動列印輸入字元的功能
- stty命令迎來控制終端的各種設定,-echo選項為關閉自動列印每個輸入字元的功能,echo選項則是開啟該功能
- 在相對複雜的shell指令碼中可以使用set -x 來開啟代碼追蹤功能,使用set +x 來關閉該功能,開啟該功能後的代碼中,凡是執行過的都會在該行首部添加一個+ 號
1 #!/bin/sh2 set -x #開啟代碼追蹤功能3 value=14 if [ “$value”x = “0”x ];then #此處在值後面加一個x是規避值為空白的情況5 printf “value is 0.\n”6 else7 printf “value isn’t 0.\n”8 fi9 set +x #關閉代碼追蹤功能
1 + value=12 + if [ “$value”x = “0”x ];then3 printf “value is 0.\n” #由於value的值不為0,所以沒有執行這句話,所以首部沒有+符號4 + else5 + printf “value isn’t 0.\n”6 + fi7 + set +x
shell教程<入門篇>