基本語法
直譯器
#!/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
它不會跳出所有迴圈,僅僅跳出當前迴圈。