(linux shell)第一章--小試牛刀(上),小試牛刀
來源:(linux shell)第一章--小試牛刀(上)
從今天開始,我們一起來學習《linux shell指令碼攻略》這本書。
1.1簡介
shell指令碼通常是一個以#!起始的文字檔,如下所示:
#!/bin/bash
有兩種執行shell指令碼的方式,分別如下:
sh script.sh 或者./script.sh
但是在執行指令碼以前,我們需要給指令碼執行許可權才行,不然指令碼無法執行
chmod a+x script.sh
在命令中行中,如果需要同時執行多個命令,可以使用
cmd1;cmd2
1.2中斷列印
1.2.1 實戰演練
echo 是用於中斷列印的基本命令。
在預設情況下,echo在每次調用後會添加一個分行符號。
只需要使用帶雙引號的文本,結合echo命令就可以將該文本在中斷上列印出來,類似的,不待雙引號的文本也可以得到童謠的輸出結果:
使用單引號看起來也可以完成同樣的任務:
這些方法看起來相思,但各有一些特殊用途和副作用,看看下面這行命令:
看到命令列拋出一個錯誤,說不能帶有驚嘆號。因此,如果希望列印驚嘆號,那就不要將其放入雙引號中,或者你可以在其之前加上一個特殊的轉移字元斜杠將驚嘆號轉移:
在使用帶單引號的echo時,Bash不會對單引號中的變數(如$var)求值,而只是照原樣顯示
另一個可以列印的命令是printf,printf使用的參數和c語言中的printf函數一樣。如:
看到沒,printf列印出來的輸出是沒有帶換行的。
1.2.2補充內容:
列印彩色輸出。每種顏色都有對應的顏色碼,比如:重設=0,黑色=30,紅色=31,綠色=32,黃色=33,藍色=34,洋紅=35,青色=36,白色=37.要列印彩色文本,可以輸入如下命令:
1.3 玩轉變數和環境變數
1.3.1 實戰演練
一個變數可以通過以下方式進行賦值:
var=value
var是變數名,value是賦給變數的值,如果value不包含任何空白字元,那麼它不需要使用引號進行引用,繁殖,則必須使用單引號或雙引號。注意,var = value不同於var=value.把var=value改寫成var = value使用常見錯誤,但前者是賦值操作,後者則是相等操作。在變數名之前加上$首碼就可以列印出變數的內容
var="value"
echo $var 或者echo ${var},可以看到中,第一個命令是錯誤的,第二三個命令整錯列印出了變數內容:
我們也可以在printf或echo命令的雙引號中引用變數值:
export命令用來設定環境變數。至此之後,從當前shell指令碼執行的任何程式都會繼承這個變數。我們可以按照自己的需要,在執行的應用程式或者shell指令碼中匯出特定變數。在預設情況下,有很多標準環境變數可供shell使用。PATH就是其中之一
$ echo $PATH
通常$PATH的值在/etc/environment或者/etc/profile或者~/.bashrc中定義。如果需要在PATH中添加一條新路徑,可以使用:
export PATH=$PATH:/home/user/bin
1.3.2 補充內容:
擷取字串的長度,可以使用下面的方法或者:
識別當前shell的版本:
echo $SHELL 或者echo $0
修改Bash提示字串
當我們開啟一個終端或是運行一個shell,都會看到類似user@hostname:/home/$的提示字串。不同的GNU/Linux發布版本中的提示及顏色也略有不同。我們可以利用PS1環境變數來定製提示文本。預設的shell提示文本是在檔案~/.bashrc中的某一行設定的。可以使用如下命令列出設定PS1的那一行:
如果要設定提示字串,可以輸入:
PS1=">",如所示,提示符已經變成">"角括弧了,但是這樣的修改只對當前的這個終端起作用,如果再新開一個終端或者電腦重啟,則會恢複到修改以前的提示符。要想設定之後生效,就必須修改~/.bashrc中的值才可以。
1.4 通過shell進行數學運算
1.4.1 預備知識
再Bash shell環境中,可以利用let,(())和[]執行基本的算術操作。而在進行進階操作時,expr和bc這兩個工具也會非常有用。
1.4.2 實戰演練
可以用普通的變數賦值方法定義數值,這時,它會被儲存為字串。然而,我們可以用一些方法使它能像數字一樣進行處理,如所示:
當然還可以進行變數的自增或者自減操作:
其它的算術操作方式:
bc是一個用於數學運算的進階工具,這個精密計算機包含了大量的選項。我們可以藉助它執行浮點數運算並應用一些進階函數:
對設定bc參數的其它操作:
1.5 玩轉檔案描述符和重新導向
1.5.1 預備知識
我們在編寫指令碼的時候會頻繁使用標準輸入(stdin),標準輸出(stdout)和標準錯誤(stderr)。通過內容過濾將輸出重新導向到檔案是我們從事的基礎任務之一。當命令輸出文本的時候,這些輸出文本有可能是錯誤資訊,也有可能是正常的(非錯誤的)輸出資訊。單靠查看輸出的文本本身,我們沒法區分哪些是正常的輸出文本,哪些是錯誤文本。不過,我們可以通過檔案描述符來解決這個問題,將哪些與特定描述符關聯的文本提取出來。
檔案描述符是與一個開啟的檔案或資料流相關聯的整數。檔案描述符0,1以及2是系統預留的。
0-----------stdin(標準輸入)
1-----------stdout(標準輸出)
2-----------stderr(標準錯誤)
1.5.2 實戰演練
用下面的方法可以將輸出文本重新導向或儲存到一個檔案中:
echo "This is a sample text 1" > temp.txt
這種方法通過截取檔案方式,將輸出文本儲存到檔案temp.txt中,也就是說在把echo命令的輸出寫入檔案之前,temp.txt中的內容首先會被清空。
接下來再看另一個例子:
echo "This is a sample text 2" >> temp.txt
這種方法將會將文本追加到目標檔案中。
>和>>並不相同。儘管這兩個操作符都可以將文本重新導向到檔案,但是前者會先清空檔案,再寫入內容,而後者將內容追加到現有檔案的尾部。
來看看什麼是標準錯誤以及如何對它重新導向。當命令輸出錯誤資訊時,stderr資訊就會被列印出來。看看下面的例子:
這裡,+是一個非法參數,因此將返回錯誤資訊。注意:當一個命令發生錯誤並退回時,它會返回一個非0的退出狀態;而當命令成功完成後,它會返回數字0,退出狀態可以從特殊變數$?中獲得(在命令執行之後立刻運行echo $?,就可以列印出退出狀態)
接下來,我們不讓錯誤資訊列印在終端,而是存入一個檔案中:
注意命令是ls + 2>out.txt。錯誤資訊輸出到out.txt中
我們也可以將標準輸出和標準錯誤資訊一同來執行到同一個命令中:
可以看到,錯誤資訊和標準輸出被輸出到不同的檔案當中了。還可以通過如下的命令將stderr轉換成stdout,使得stderr和stdout都被重新導向到同一個檔案中:
cmd 2>&1 output.txt 或者cmd &> output.txt。有時候,在輸出中可能包含一些不必要的資訊。如果你不想讓終端中充斥著有關stderr的繁枝末節,那麼你可以將stderr的輸出重新導向到/dev/null,保證一切都會被清除的乾乾淨淨。假設我們有三個檔案,分別是a1,a2,a3。但是普通使用者對檔案a1沒有“讀-寫-執行”許可權。如果你需要列印檔案名以a起始的所有檔案的內容,你可以使用cat命令:
可以看到,a1檔案已經沒有任何許可權,但是因為我是用root使用者登入,所以還是可以讀內容的,如果其它使用者讀取a1,則會報錯,這時我們就可以使用標準錯誤輸出來捕獲錯誤輸出,然後輸出其它檔案的內容:
1.5.3 補充內容
從stdin讀取輸入的命令能以多種方式接受資料。另外,還可以用cat和管道來制定我們自己的檔案描述符,例如:
cat file | cmd
cmd1 | cmd2
將檔案重新導向到命令:
cmd < file
夢幻西遊(對於“小試牛刀”?)
那個是夢幻對60級以下0-59級的小號設計的新手技能
技能名稱
牛刀小試
使用等級
等級≤59級
使用效果
傷害單個敵人HP=自身等級+80
使用消耗
20點魔法值
特別說明
等級≤59級的玩家進入戰鬥後可以在技能中選擇該技能使用
非戰鬥狀態不會顯示該技能
小試牛刀?
小試牛刀 (也可作 牛刀小試)
釋 義 牛刀:宰牛的刀;小試:稍微用一下,初顯身手。比喻有大本領的人,先在小事情上略展才能。也比喻有能力的人剛開始工作就表現出彩
出 處 宋·蘇軾《送歐陽主簿赴官韋城》詩:“讀遍牙籤三萬軸,欲來小邑試牛刀。”
“牛刀”語見《論語.陽貨》“子之武城,聞弦歌之聲。夫子莞爾而笑曰‘割雞焉用牛刀?’” 釋義 牛刀宰牛用的刀,比喻大才;小試稍微用一下,含初步顯一下身手的意思。“牛刀小試”,比喻大才初次任職,就已經表現出才幹。“割雞焉用牛刀”,意思是大才何需用於小處,小題不必大做。
付善明[權威專家]