shell入門教程(1)-shell基礎 - justkk的專欄 - 部落格頻道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/43795131
shell入門教程(2)-變數和參數 - justkk的專欄 - 部落格頻道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/44081993
shell入門教程(3)-命令編輯 - justkk的專欄 - 部落格頻道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/44617445
shell入門教程(4)-作業控制 - justkk的專欄 - 部落格頻道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/46801163
SHELL入門教程(5)-算術運算 - justkk的專欄 - 部落格頻道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/47025297
SHELL入門教程(6)-環境 - justkk的專欄 - 部落格頻道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/47025321
SHELL入門教程(7)-編寫指令碼 - justkk的專欄 - 部落格頻道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/47025397
一、簡單指令檔
1、用 vi或其他編輯器把下面的兩行寫入一個檔案,命名為1.sh。
echo "We have these files:"
ls
2、這就是一個簡單的指令檔,為其添加執行許可權:
chmod +x 1.sh
3、執行(前面的./指定目前的目錄,意思是明確指定執行目前的目錄下的1.sh檔案)
./1.sh
觀察螢幕輸出結果。
看,一個簡單的指令檔就是這樣。
二、過程執行
1、單行多命令
可以在一行中指定多個待執行的命令,採用分號分隔,多個命令將依次執行。如:
ls;date;pwd
2、命令續行
如果在行尾輸入反斜線\,可以在下一行繼續整個命令的輸入,如:
echo a b \
> c
其中的> 是SHELL給出的命令續行符號。最後整個命令的輸出結果是a b c
3、後台執行
在命令的結尾添加符號&,此時命令將在後台執行。你不用等待當前命令執行結束就可以輸入新的命令。通常用於執行耗時很長的命令。如:
sleep 10 &
這個命令會睡眠10秒鐘,在這個命令後台執行的同時,你可以繼續在前台執行其他的命令。
4、管道
表示符號是豎線|,可以串接兩個命令,前面命令的輸出將作為後面命令的輸入,如:
ls|wc –l
wc命令用以統計輸入行數,那麼整個命令的效果就是統計目前的目錄下的檔案數目。
5、條件執行
如果使用&&串接兩個命令,那麼只有前面命令執行成功時,後面的命令才得以執行。如:
ls 1.sh && echo "file 1.sh is here "
因為1.sh存在,後面的echo命令得以執行,並輸出資訊file 1.sh is here
如果刪除1.sh檔案(rm 1.sh),再次執行上面的串接命令,你會發現echo命令不再執行。
相反,如果使用||串接兩個命令,那麼只有前面命令執行失敗時,後面的命令才得以執行。
思考,command1 && command2 || command3
command1執行成功時,command2執行,而command3不執行。
command1執行失敗時,command2不執行,而command3執行。
6、命令組合
可以使用一對{}或()組合命令,組合的命令整體上作為單個命令來看待。
比較下面兩行命令的輸出結果,並分析:
echo 123;echo 456|wc –l
{ echo 123;echo 456;}|wc –l
注意格式要求,{後面必須有空白字元,}前面必須有一個分號。
{}分組的命令在當前shell中執行,而()分組的命令在子shell中執行。
子shell是當前shell複製的一個副本,其執行結果不會影響當前shell。
子shell的概念後面詳述。
三、IO重新導向
1、重新導向標準輸出
命令的執行結果通常輸出到螢幕,可以使用>符號重新導向到檔案中,如:ls>flist
命令執行之後,螢幕不再顯示輸出資訊,而檔案flist的內容將包含目前的目錄下的檔案清單。
如果檔案flist之前不存在,將被建立;如果之前存在,其內容將被覆蓋。
可以直接使用>建立一個空的檔案,如:
> a_new_file
可以使用>>實現追加重新導向,輸出結果追加寫入檔案,如:ls >>flist
noclobber選項
禁止重新導向到一個已經存在的檔案,這個選項預設是關閉的。可以使用下面的命令開啟:
set -o noclobber
此時再次嘗試重新導向時將報錯:cannot overwrite existing file
ls > flist
但是依然可以強制重新導向,忽視這個選項的設定,如:ls>|flist
2、重新導向標準輸入,通過符號<使用檔案的內容作為命令的輸入資訊,如:cat < flist
3、檔案描述符
程式使用檔案描述符來標識開啟的檔案,shell自動為程式開啟了3個描述符,0,1,2
0表示標準輸入 1表示標準輸出 2表示標準錯誤輸出
說明:標準錯誤輸出預設也是對應到螢幕,但是與標準輸出不同,通常用以輸出錯誤資訊。
重新導向錯誤輸出,在符號>之前添加描述符2(注意2和>之間沒有間隔),假定檔案aa不存在:
ls aa 2>err.out
也就是說,在符號>之前可以添加描述符,省略則隱含是1。
ls aa bb >myout 2>&1
錯誤輸出與標準輸出都重新導向到檔案myout中,也就是合并了兩個描述符的輸出資訊。
4、嵌入文本
cat <<!
aa
bb
!
其中的符號!用以界定輸入資訊的結束,中間的文本都作為命令的輸入。
注意結束的符號需要寫在一行的開頭,前面不能添加<TAB>或空格。
符號的表示方式不是強制的,只要配對即可,你可以使用任何你喜歡的字元或字串。
如果採用下面的方式,也就是在符號之前添加了一個-,此時結束符號不需要頂頭書寫,前面可以添加<TAB>,但是依然不能添加空格。
cat <<-!
shell會刪除文本中的<TAB>字元。
說明:<<之前也可以添加描述符。
5、丟棄標準輸出
ls >/dev/null
ls aa bb >/dev/null 2>&1
後者同時丟棄標準輸出與標準錯誤輸出。
/dev/null是一個特殊裝置,可以看做一個黑洞。
四、檔案名稱替換
1、字元* --匹配0或多個字元
單獨使用時匹配目前的目錄下的所有檔案(以小數點.打頭的檔案名稱除外)。
ls a* 顯示所有以字母a打頭的檔案名稱
ls *b 顯示所有以字母b結尾的檔案名稱
2、字元? --精確匹配一個字元
ls ?? 顯示兩個字元的檔案名稱
3、字元[] --匹配一個範圍
ls [ab]* 顯示所有以字母a或b打頭的檔案名稱
ls [a-z]* 顯示所有以小寫字母打頭的檔案名稱
4、字元! --與[]搭配使用,表示反向匹配
ls [!a]* 顯示所有不是以字母a打頭的檔案名稱
5、字元. --明確指定匹配.打頭的檔案名稱
ls .[a-c] 顯示所有以.a/.b/.c打頭的檔案名稱
6、複合模式
*(pattern) 模式重複0或多次
?(pattern) 模式重複0或1次
+(pattern) 模式重複1或多次
@(pattern) 模式重複1次
!(pattern) 模式排除
例如:ls *(a) 顯示所有的a重複任意次數的檔案名稱
7、禁止檔案名稱替換
set -f 或 set -onoglob
此時特殊字元* ?等失去其特殊含義,僅僅表示字元本身。
五、命令替換
1、原地展開命令的輸出資訊,通常用以為變數賦值,或在命令中嵌入另一個命令的輸出。
格式為:$(command),樣本:
a=$(date +“%Y%m%d”) 定義一個變數,賦值為當天的日期
echo "today is $(date +"%Y%m%d")“
2、或者採用相容格式:`command`
注意其中的符號是鍵盤上數字1左邊的那個字元
3、直接檔案輸入,格式為:$(<file)
整體替換為檔案內容,如:
X=$(<foo) 定義一個變數,賦值為檔案foo的內容
4、算術運算,$((arithmetic-expression))
如:echo $((3*9))
六、波浪號~替換
~ 展開為目前使用者的HOME目錄
~user 展開為特定使用者user的HOME目錄
~- 展開為前一個目錄,即$OLDPWD
~+ 展開為目前的目錄,即$PWD
cd - 切換到之前的目錄
實驗,並觀察結果:
cd /tmp
cd ~root
cd -
再一次cd -