(linux shell)第一章--小試牛刀(上)

來源:互聯網
上載者:User

標籤: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,都會看到類似[email protected]:/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


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.