shell指令碼學習初級教程- 備忘錄

來源:互聯網
上載者:User

1,寫在前面

      這是系列學習文檔,基於互連網的分享精神,主要來源於論壇上的shell專區,有整理而來,本身是一本書上的內容,所以著作權麼屬於書的原作者,這裡我們只做學習材料,其實這幾篇文檔整理還是很飛逝間的,畢竟論壇上格式還是比較難以閱讀的,起碼沒什麼樂趣,當然還是向斑竹表示敬意,如果您覺得此系列文章不妥,請告知。

      這個系列文檔大概有六篇左右,講的屬於基本入門的東西,作為營運來說,掌握一些指令碼知識是必要的。同時我也會寫幾篇學習筆記,主要是作為自己的備忘錄,沒事遺忘的時候可以翻翻。

      以後將附上學習備忘錄。

2,開篇第一章

       這裡面本來有環境變數和shell變數知識,由於比較簡單,不再轉了,大家網上搜尋一下都應該沒問題的。

        我們從引號轉載:

        我整理如下:

         2.1引用必要性
    這裡只講述引用的基本規則。因為使用引用的例子很多。本書接下來的兩個部分將一一予以講述。指令碼中執行行操作時, shell將對指令碼設定予以解釋。要採取一種方法防止shell這樣做,即使用引用號,包括各式引用或使用反斜線。
一些使用者在對文本字串進行反饋操作時覺得使用引用很麻煩。有時不注意,只引用了一半,這時問題出現了。

最好在反饋文本字串時使用雙引號。

下面是各種引用的例子。
echo Hit the star button to exit *
Hit the star button to exit child.sh father.sh findfile.sh param2.sh param.sh who_is.sh
文本返回了,但由於未使用雙引號, *被shell誤解,shell認為使用者要做目錄列表。用雙引號得結果如下:
echo "Hit the star button to exit *"
Hit the star button to exit *

這樣就不會有誤解產生。表1 5 - 1列出各種參考型別。
表15-1 shell參考型別
" " 雙引號  ` 反引號(這個準確說是法語裡面的符號)
' ' 單引號  \ 反斜線

    2.1.1 雙引號
使用雙引號可引用除字元$、`、\外的任一字元或字串。這些特殊字元分別為貨幣符號,反引號和反斜線,對shell來說,它們有特殊意義。如果使用雙引號將字串賦給變數並反饋它,實際上與直接反饋變數並無差別。
            STRING="MAY DAY, MAY DAY, GOING DOWN"
   echo "$STRING"
MAY DAY, MAY DAY, GOING DOWN
            $ echo $STRING
MAY DAY, MAY DAY, GOING DOWN


現在假定要設定系統時間輸出到變數mydate.
   MYDATE="date"
            echo $MYDATE
date

因為shell將" "符號裡的字串賦予變數mydate,date已沒有特定意義,故此變數只儲存單詞date。如果要查詢包含空格的字串,經常會用到雙引號。以下使用grep抽取名字"Davey Wi r e",因為沒有加雙引號,grep將"Davey"認作字串,而把“Wire”當作檔案名稱
$ grep Davey Wire /etc/passwd
$ grep: Wire: No such file or directory
$ grep "Davey Wire" /etc/passwd

要解決這個問題,可將字串加雙引號。這樣shell忽略空格,當使用字元時,應總是使用雙引號,無論它是單個字串或是多個單詞。
在一個反饋的文本行裡可以使用雙引號將變數引起來。下面的例子中,shell反饋文本行,遇到符號$,知道這是一個變數,然後用變數值boy替換變數$BOY。
$ echo " The $BOY did well"
The boy did well
$ echo " The "$BOY" did well"
 The boy did well
    單引號與雙引號類似,不同的是shell會忽略任何引用值。換句話說,如果屏蔽了其特殊含義,會將引號裡的所有字元,包括引號都作為一個字串。使用上一個例子,結果如下:
     $ GIRL='girl'
     $ echo "The '$GIRL' did well"
     The 'girl' did well

        2.1.2 反引號
反引號用於設定系統命令的輸出到變數。shell將反引號中的內容作為一個系統命令,並執行其內容。使用這種方法可以替換輸出為一個變數。反引號可以與引號結合使用。下面將舉例說明。
下面的例子中, shell試圖替代單詞hello為系統命令並執行它,因為hello指令碼或命令不存在,返回錯誤資訊。
$ echo `hello`
bash: hello: command not found
$ echo `date`
Sat Nov 20 21:40:47 CST 2010
這次命令有效,shell正確執行.下面將命令輸出設定為變數mydate,時間格式如下
$ date +%A" the "%e" of "%B" "%Y
Saturday the 20 of November 2010
$ mydate=`date +%A" the "%e" of "%B" "%Y`
$ echo $mydate
Saturday the 20 of November 2010
$ mydate=`date`
$ echo $mydate
Sat Nov 20 21:43:06 CST 2010

另一個例子中,將反引號嵌在雙引號裡:
           $ echo "The date today is `date`"
The date today is Sat Nov 20 21:44:03 CST 2010
          $ echo "There are `who | wc -l` users on the system"
There are 3 users on the system

    上面的例子中,列印字串後,shell遇到反引號,將其看作一條命令執行它。

 如果下一個字元有特殊含義,反斜線防止shell誤解其含義,即屏蔽其特殊含義。下述字元包含有特殊意義: & * + ^ $ ` " | ?。
 假定echo命令加*,意即以串列順序列印當前整個目錄列表,而不是一個星號*.
 
 $ echo *
ild.sh father.sh findfile.sh param2.sh param.sh who_is.sh
  為屏蔽星號特定含義,可使用反斜線。
 $ echo \*
*
 上述語句同樣可用於$$命令, shell解釋其為現在進程ID號,使用反斜線屏蔽此意,僅打
  印$$。
$ echo $$
7906
$ echo \$$
$$
 在列印字串時要加入八進位字元(ASCII相應字元),必須在前面加反斜線,否則shell將其當作普通數文書處理。
$ echo " This is a copyright 251 sign"
This is a copyright 251 sign

 $ echo -e " This is a copyright \0373 sign"
This is a copyright

      Linux下需要使用\0NNN的八進位的方式才可以把特殊字元copyright的字元顯示出來。
      使用命令expr時,用*表示乘法會出現錯誤,在*前加上反斜線才會正確。
             $ expr 12 * 12
expr: syntax error
   $ expr 12 \* 12
144
  在echo命令中加入元字元,必須用反斜線起屏蔽作用。下面的例子要顯示價格$19.99。其中$屏蔽與不屏蔽將產生不同的結果。
   $ echo "That video looks a good price for $19.99"
That video looks a good price for 9.99
   $ echo "That video looks a good price for \$19.99"
That video looks a good price for $19.99
  使用反斜線屏蔽$,可得更好的結果。
 

     在引用時會遇到一些問題且經常出錯。我在使用引用時遵循兩條規則:
  1) 反饋字串用雙引號;但不要引用反饋本身。
  2) 如果使用引用得到的結果不理想,再試另一種,畢竟只有三種引用方式,可以充分嘗試。

3,學習備忘

      上面的內容有些地方不是太正確。

      1,反引號
裡面關於雙引號的嵌套
樣本: $ mydate=`date +%A" the "%e" of "%B" "%Y`
        $ echo $mydate

可以試試去掉雙引號的效果,會提示你date: 額外的運算元 "the"請嘗試執行"date --help"來擷取更多資訊。
其實這裡面引號匹配要看清楚分別是" the "," of "," ",按照文檔所述""中只有\,`,$符號轉義,其他照常輸出的,所以不要誤認"%e"是雙引號匹配的。
有興趣驗證echo "%e",挺有意思的。
   2,echo *
      shell裡面有些特殊含義字元如: & ` " | ?
      如果想屏蔽特殊含義,需要反斜線\,
      試試echo * 和echo \*,而echo $,*,+,^,?都可以正常輸出,這點好像教材將錯了。
      應該是打錯了,真正還有些特殊字元。<,>,\,(,),;,~,#,其中#;符號無輸出。~輸出使用者路徑。其他均無法直接輸出。
   3,expr 
         expr 12*12 
        輸出 12*12,認為是第一個運算元,要用空格分開,如expr 12 * 12方可,同時加上反斜線\,expr 12 \* 12

    

相關文章

聯繫我們

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