shell入門教程(1)-shell基礎

來源:互聯網
上載者:User

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 -

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.