shell指令碼入門筆記

來源:互聯網
上載者:User
1、條件測試

兩種格式:  test condition  或  [ condition ](注意兩邊加了空格)
condition可以是多個子條件的邏輯運算,邏輯運算子號有以下幾種:

-a         邏輯與

-o        邏輯或

!          邏輯否

&&, ||


2、檔案測試

檔案測試利用條件測試的方式測試一個檔案或者目錄的狀態,如是否存在、是否可讀等,具體的測試參數如下:

-d         目錄

-f         普通檔案(Regular file)

-L         符號連結

-r         Readable(檔案、目錄可讀)

-b         塊專用檔案

-e         檔案存在

-g         如果檔案的set-group-id位被設定則結果為真

-s         檔案長度大於0,非空

-z         檔案長度=0

-w        Writable(檔案、目錄可寫)

-u         檔案有suid位設定

-x         Executable(檔案可執行、目錄可瀏覽)

-c         字元專用檔案

-L         符號連結

例如測試檔案file.txt是否存在,可以這樣測試:

$test -e file.txt 或者 [ -e file.txt ]


3、字串測試

字串測試可以測試字串是否為空白,測試兩個字串是否相等等,具體的測試參數如下:

=         兩字串相等

!=        兩字串不等

-z         空串 [zero]

-n         非空串 [nozero]


4、數值測試

數值測試用於測試兩個參數的大小、相等等情況,格式是:“number” numberic_operator “number” 或  [ “number” numberic_operator “number”],numberic_operator取值如下:

-eq       數值相等(equal)

-ne       不等(not equal)

-gt        A>B(greater than)

-lt         A<B(less than)

-le        A<=B(less、equal)

-ge       A>=B(greater、equal)

(疑問:好像不能用一個變數跟一個數值常量比較,要將值賦給變數然後比較兩個變數,待考證!)


5、if結構

if 條件1
then 
      命令1
elif  條件2
then 
      命令2
else 
      命令3
fi


6、case結構

case variable in
       pattern [| pattern] …..) #匹配模式之間用"|"隔開
             命令….
             ;;
       模式2)
             命令…..
             ;;
       *) #匹配所有
             …….
             ;;
esac


7、for結構

for 變數名 in 列表
do
      命令1
      命令2
done

例子:

用於數值序列:
for loop in 1 2 3 4 5
for i in {1..10}
for ((i = 1; i <= 10; i++))

用於字串序列:
for loop in “orange red blue grey”

用於命令的執行結果:
for loop in `ls`

無限迴圈:
for files in *


8、until結構

until  condition
do
      命令…..
done


9、while結構

while condition
do
      命令1
      命令2
done


10、bash 的組數(array)

一般而言,A="a b c def" 這樣的變數只是將 $A 替換為一個單一的符串,
但是改為 A=(a b c def) ,則是將 $A 定義為組數...
bash 的組數替換方法可參考如下方法:
${A[@]} 或 ${A[*]} 可得到 a b c def (全部組數)
${A[0]} 可得到 a (第一個組數),${A[1]} 則為第二個組數...
${#A[@]} 或 ${#A[*]} 可得到 4 (全部組數數量)
${#A[0]} 可得到 1 (即第一個組數(a)的長度),${#A[3]} 可得到 3 (第四個組數(def)的長度)
A[3]=xyz 則是將第四個組數重新定義為 xyz ...


11、三個重要符號

hard quote:' ' (單引號),凡在 hard quote 中的所有 meta 均被關閉。
soft quote: " " (雙引號),在 soft quoe 中大部份 meta 都會被關閉,但某些則保留(如 $ )。
escape : \ (反斜線),只有緊接在 escape (跳脫字元)之後的單一 meta 才被關閉。

例如:命令echo '$0 outside function is '$0,第一個$0不會解開,直接輸出字元"$0",而第二個$0會被解開,輸出當前shell script的路徑;

如果用命令echo "$0 outside function is "$0,則兩個$0都會被解開,因此不能達到想要的結果。

(注意:在vim中編寫shell script時,vim的顏色提示就可以看出符號是否解開,即是按一般字元串處理,還是按meta處理)


【其他重點規則】

  • ( ):將其內的命令置於 nestedsubshell 執行,或用於運算或命令替換。(變數修改是臨時的)
  • { }:將其內的命令置於 non-namedfunction 中執行,或用在變數替換的界定範圍。(變數修改對本shell有效)
  • ${ }或` `(反引號):用來做命令替換,也就是執行括弧裡面的命令列,然後返回命令列執行的結果。
  • $(( )):用來做整數計算。如:
    $ a=5; b=7; c=2
    $ echo $(( a+b*c ))
  • (( )):可重定義變數值,或作條件測試。如:
    a=5; ((a++)) 可將 $a 重定義為 6
    a=5; b=7; ((a < b)) 會得到0 (true) 的傳回值。
  • 命令、函數或者shell指令碼的傳回值只有兩種:0為"真"( true ),非0為"假"( false )
  • $#: 添加到Shell的參數個數
  • $$: Shell本身的PID(ProcessID)
  • $!: Shell最後啟動並執行後台Process的PID
  • $?: 最後啟動並執行命令的結束代碼(傳回值)
  • $*: 所有參數列表。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數。
  • $@: 所有參數列表。如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。








相關文章

聯繫我們

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