shell程式設計基礎

toymm發表於2018-06-28

基本語法

直譯器

#!/bin/bash
#!/bin/sh
#!/usr/bin/env bash
複製程式碼

變數

定義變數

定義變數時,變數名不加美元符號,規則如下

  • 命名只能使用英文字母,數字和下劃線,首字母不能以數字開頭
  • 中間不能有空格,可以使用下劃線
  • 不能使用標點符號
  • 不能使用bash的關鍵字

使用變數時只要在變數名前家美元符號即可

使用readonly命令可以將變數定義為只讀

使用unset命令可以刪除變數

#!/bin/sh

VERSION=1.0.1
readonly VERSION
echo "hello world $VERSION"
unset VERSION
複製程式碼

字串

單引號

  • 單引號裡的任何字元都會原樣輸出,單引號字串中的變數時無效的
  • 單引號字串中不能出現單引號

雙引號

  • 雙引號裡可以有變數
  • 雙引號裡可以出現轉義字元

陣列

在Shell中,用括號來表示陣列,陣列元素用"空格"符號分割開。定義陣列的一般形式為:

array_name=(value0 value1 value2 ...)
或者
array_name=(
value0
value1
value2
value3
)
複製程式碼

還可以單獨定義陣列的各個分量:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
複製程式碼

讀取陣列

#獲取某項
${array_name[n]}

#獲取陣列總所有元素
echo ${array_name[@]} 
複製程式碼

獲取陣列的長度

# 取得陣列元素的個數
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得陣列單個元素的長度
lengthn=${#array_name[n]}
複製程式碼

shell流程控制

和Java、PHP等語言不一樣,sh的流程控制不可為空,如(以下為PHP流程控制寫法):

<?php
if (isset($_GET["q"])) {
    search(q);
}
else {
    // 不做任何事情
}
複製程式碼

在sh/bash裡可不能這麼寫,如果else分支沒有語句執行,就不要寫這個else。

if else

condition 和方括號([ ])之間必須有空格,否則會有語法錯誤。

if [ condition1 ]
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi
複製程式碼

以下例項判斷兩個變數是否相等:

a=10
b=20
if [ $a == $b ] #  或者 if test a -eq b
then
   echo "a 等於 b"
elif [ $a -gt $b ]
then
   echo "a 大於 b"
elif [ $a -lt $b ]
then
   echo "a 小於 b"
else
   echo "沒有符合的條件"
fi


輸出結果:a 小於 b
複製程式碼

shell中的test命令用於檢查條件是否成立,它可以進行數值、字元、檔案三方面的測試

數值測試

引數 說明
-eq 等於則為真
-ne 不等於則為真
-gt 大於則為真
-ge 大於等於則為真
-lt 小於則為真
-le 小於等於則為真

字串測試

引數 說明
= 等於則為真
!= 不相等則為真
-z 字串 字串長度偽則為真
-n 字串 字串長度不偽則為真

檔案測試

引數 說明
-e 檔名 如果檔案存在則為真
-r 檔名 如果檔案存在且可讀則為真
-w 檔名 如果檔案存在且可寫則為真
-x 檔名 如果檔案存在且可執行則為真
-s 檔名 如果檔案存在且至少有一個字元則為真
-d 檔名 如果檔案存在且為目錄則為真
-f 檔名 如果檔案存在且為普通檔案則為真
-c 檔名 如果檔案存在且為字元型特殊檔案則為真
-b 檔名 如果檔案存在且為塊特殊檔案則為真

for迴圈

in列表可以包含替換、字串和檔名。

in列表是可選的,如果不用它,for迴圈使用命令列的位置引數。

for i in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done
複製程式碼

while 語句

while迴圈用於不斷執行一系列命令,也用於從輸入檔案中讀取資料;命令通常為測試條件。其格式為:

while(( condition ))
do
    command
done
複製程式碼

until 迴圈

until 迴圈執行一系列命令直至條件為 true 時停止。

until 迴圈與 while 迴圈在處理方式上剛好相反。

一般 while 迴圈優於 until 迴圈,但在某些時候—也只是極少數情況下,until 迴圈更加有用。

until 語法格式:

until condition
do
    command
done
複製程式碼

condition 一般為條件表示式,如果返回值為 false,則繼續執行迴圈體內的語句,否則跳出迴圈。

#!/bin/bash

a=0

until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

結果:
0
1
2
3
4
5
6
7
8
9
複製程式碼

case

Shell case語句為多選擇語句。可以用case語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令。case語句格式如下:

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac
複製程式碼

跳出迴圈

break命令允許跳出所有迴圈(終止執行後面的所有迴圈)。

continue它不會跳出所有迴圈,僅僅跳出當前迴圈。

相關文章