1. 程式人生 > >Shell 指令碼(shell script)學習

Shell 指令碼(shell script)學習

test.sh 

#!/bin/bash
echo "Hello World !"

執行方法

1、作為可執行程式

將上面的程式碼儲存為 test.sh,並 cd 到相應目錄:

chmod + x  目錄 

chmod +x ./test.sh  #使指令碼具有執行許可權
./test.sh  #執行指令碼

2、作為直譯器引數

這種執行方式是,直接執行直譯器,其引數就是 shell 指令碼的檔名,如:

/bin/sh 目錄

/bin/sh test.sh

變數 

使用變數

使用一個定義過的變數,只要在變數名前面加美元符號即可,如:

your_name="qinjx"
echo $your_name
echo ${your_name}

只讀變數

使用 readonly 命令可以將變數定義為只讀變數,只讀變數的值不能被改變。

下面的例子嘗試更改只讀變數,結果報錯:

#!/bin/bash
myUrl="http://www.google.com"
readonly myUrl
myUrl="http://www.runoob.com"

執行指令碼,結果如下:

/bin/sh: NAME: This variable is read only.

刪除變數

使用 unset 命令可以刪除變數。語法:

unset variable_name

變數被刪除後不能再次使用。unset 命令不能刪除只讀變數。

例項

#!/bin/sh
myUrl="http://www.runoob.com"
unset myUrl
echo $myUrl

字串

字串是shell程式設計中最常用最有用的資料型別(除了數字和字串,也沒啥其它型別好用了),字串可以用單引號,也可以用雙引號,也可以不用引號。單雙引號的區別跟PHP類似。

單引號

str='this is a string'

單引號字串的限制:

  • 單引號裡的任何字元都會原樣輸出,單引號字串中的變數是無效的;
  • 單引號字串中不能出現單獨一個的單引號(對單引號使用轉義符後也不行),但可成對出現,作為字串拼接使用。

雙引號

your_name='runoob'
str="Hello, I know you are \"$your_name\"! \n"
echo $str
Hello, I know you are "runoob"! 

輸出結果為:

雙引號的優點:

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

拼接字串

your_name="runoob"
# 使用雙引號拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1
# 使用單引號拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

輸出結果為:

hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !

獲取字串長度

string="abcd"
echo ${#string} #輸出 4

提取子字串

以下例項從字串第 2 個字元開始擷取 4 個字元:

string="runoob is a great site"
echo ${string:1:4} # 輸出 unoo

查詢子字串

查詢字元 i 或 o 的位置(哪個字母先出現就計算哪個):

string="runoob is a great site"
echo `expr index "$string" io`  # 輸出 4

注意: 以上指令碼中 ` 是反引號,而不是單引號 ',不要看錯了哦。

Shell 陣列

bash支援一維陣列(不支援多維陣列),並且沒有限定陣列的大小。

類似於 C 語言,陣列元素的下標由 0 開始編號。獲取陣列中的元素要利用下標,下標可以是整數或算術表示式,其值應大於或等於 0。

定義陣列

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

陣列名=(值1 值2 ... 值n)

例如:

array_name=(value0 value1 value2 value3)

或者

array_name=(
value0
value1
value2
value3
)

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

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

可以不使用連續的下標,而且下標的範圍沒有限制。

讀取陣列

讀取陣列元素值的一般格式是:

${陣列名[下標]}

例如:

valuen=${array_name[n]}

使用 @ 符號可以獲取陣列中的所有元素,例如:

echo ${array_name[@]}

獲取陣列的長度

獲取陣列長度的方法與獲取字串長度的方法相同,例如:

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

Shell 註釋

以 # 開頭的行就是註釋,會被直譯器忽略。

通過每一行加一個 # 號設定多行註釋,像這樣:

# 這是一個註釋

如果在開發過程中,遇到大段的程式碼需要臨時註釋起來,過一會兒又取消註釋,怎麼辦呢?

每一行加個#符號太費力了,可以把這一段要註釋的程式碼用一對花括號括起來,定義成一個函式,沒有地方呼叫這個函式,這塊程式碼就不會執行,達到了和註釋一樣的效果。

多行註釋

多行註釋還可以使用以下格式:

:<<EOF
註釋內容...
註釋內容...
註釋內容...
EOF

EOF 也可以使用其他符號:

:<<'
註釋內容...
註釋內容...
註釋內容...
'

:<<!
註釋內容...
註釋內容...
註釋內容...
!

傳遞引數

echo "執行的檔名:$0"; echo "第一個引數為:$1";

 

基本運算子 

原生bash不支援簡單的數學運算,但是可以通過其他命令來實現,例如 awk 和 expr,expr 最常用

echo `expr 2 + 2`

******(注意使用的是反引號 ` 而不是單引號 '

echo `expr $1 + $2`

關係運算符

關係運算符只支援數字,不支援字串,除非字串的值是數字。

下表列出了常用的關係運算符,假定變數 a 為 10,變數 b 為 20:

運算子 說明 舉例
-eq 檢測兩個數是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 檢測兩個數是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 檢測左邊的數是否大於右邊的,如果是,則返回 true。 [ $a -gt $b ] 返回 false。
-lt 檢測左邊的數是否小於右邊的,如果是,則返回 true。 [ $a -lt $b ] 返回 true。
-ge 檢測左邊的數是否大於等於右邊的,如果是,則返回 true。 [ $a -ge $b ] 返回 false。
-le 檢測左邊的數是否小於等於右邊的,如果是,則返回 true。 [ $a -le $b ] 返回 true。

布林運算子

下表列出了常用的布林運算子,假定變數 a 為 10,變數 b 為 20:

運算子 說明 舉例
! 非運算,表示式為 true 則返回 false,否則返回 true。 [ ! false ] 返回 true。
-o 或運算,有一個表示式為 true 則返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 與運算,兩個表示式都為 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。

邏輯運算子

以下介紹 Shell 的邏輯運算子,假定變數 a 為 10,變數 b 為 20:

運算子 說明 舉例
&& 邏輯的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 邏輯的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true

字串運算子

下表列出了常用的字串運算子,假定變數 a 為 "abc",變數 b 為 "efg":

運算子 說明 舉例
= 檢測兩個字串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 檢測兩個字串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 檢測字串長度是否為0,為0返回 true。 [ -z $a ] 返回 false。
-n 檢測字串長度是否為0,不為0返回 true。 [ -n "$a" ] 返回 true。
str 檢測字串是否為空,不為空返回 true。 [ $a ] 返回 true。

echo命令

1.顯示普通字串:

echo "It is a test"

這裡的雙引號完全可以省略,以下命令與上面例項效果一致:

echo It is a test

2.顯示轉義字元

echo "\"It is a test\""

結果將是:

"It is a test"

同樣,雙引號也可以省略

3.顯示變數

read 命令從標準輸入中讀取一行,並把輸入行的每個欄位的值指定給 shell 變數

#!/bin/sh
read name 
echo "$name It is a test"

 

4.顯示換行

echo -e "OK! \n" # -e 開啟轉義
echo "It is a test"

6.顯示結果定向至檔案

#!/bin/sh
echo "It is a test" > cjb.txt

 

7.原樣輸出字串,不進行轉義或取變數(用單引號)

echo '$name\"'

8.顯示命令執行結果

echo `date`

 printf 命令 

   跟c語言類似

printf  format-string  [arguments...]

引數說明:

  • format-string: 為格式控制字串
  • arguments: 為引數列表。

判斷

#!/bin/sh a=10 b=20 if [$a>@b] then  echo "a>b" else  echo "a<b" fi

如果else分支沒有語句執行,就不要寫這個else。

for 迴圈

for loop in 1 2 3 4 5 do     echo "The value is: $loop" done

#!/bin/bash   for((i=1;i<=10;i++)); do  echo $i; done

錯誤提示: 

解決方法: 

1、將預設shell更改為bash。(bash支援C語言格式的for迴圈)

sudo dpkg-reconfigure dash

2.  在選擇項中選No  

Shell 函式

#!/bin/bash

demoFun(){     echo "這是我的第$1個 shell 函式!"     echo "這是我的第$2個 shell 函式!" } echo "-----函式開始執行-----" demoFun $1 $2 echo "-----函式執行完畢-----"