#! /bin/bash
# shell程式設計基礎
通常在第1行以「#!」開頭指定Shell指令碼的執行環境,即宣告該指令碼使用哪個Shell程式執行。如果沒有指定,則以當前正在執行的Shell來解釋執行。
以「#」開頭的行是註釋行
# 字串左右的反引號(`)用於命令轉換(轉換)
包含外部指令碼檔案的用法如下:
. 指令碼檔名,
./指令碼檔名
或
source 指令碼檔名
bash 指令碼檔名
兩種方式的作用一樣,爲簡單起見,一般使用點號,但要注意點號和指令碼檔名之間一定要有一個空格。
在bash中Shell指令碼的偵錯主要是利用bash命令解釋程式的選項來實現。其格式爲:
bash [選項] 指令碼名
-v 選項允許使用者檢視Shell程式的讀入和執行,會列印出命令列的原始內容。
-x 選項允許使用者檢視Shell程式的執行,會列印出經過替換後的命令列的內容。
變數無需事先宣告,給變數賦值也就是定義一個變數的過程:
變數名=變數值
等號兩邊不能留空格
參照時需要$符號,如果緊跟在變數名稱後面的字元是字母、數位或下劃線,變數名稱必須要用{}括起來
刪除變數
使用 unset 命令可以刪除變數。
新增環境變數
使用export命令將變數新增到環境中,作爲臨時的環境變數(一種全域性變數)。
$0 當前指令碼的檔名
$n 傳遞給指令碼或函數的參數。n是一個數字,表示第幾個參數。例如,第一個參數是$1,以此類推
$# 傳遞給指令碼或函數的參數個數
$* 傳遞給指令碼或函數的所有參數
$@ 傳遞給指令碼或函數的所有參數。被雙引號(" ")包含時,與 $* 稍有不同
$? 上個命令的退出狀態,或函數的返回值
$$ 當前Shell進程ID。對於 Shell 指令碼,就是這些指令碼所在的進程ID
bash支援一維陣列,不支援多維陣列。
在Shell中用括號來表示陣列,陣列元素用空格符號分割開:
陣列名=(值1 ... 值n)
也可以單獨定義陣列的各個元素。可以不使用連續的下標,而且下標的範圍沒有限制。
讀取陣列元素值的語法格式爲:
${陣列名[下標]}
採用以下用法獲取陣列元素的個數:
${#陣列名[@]}
以下方法用於取得陣列單個元素的長度:
${#陣列名[n]}
bash自身並不支援簡單的數學運算,但是可以通過awk 和expr等命令來實現數學運算。
expr最爲常用,使用它能夠完成表達式的求值操作。
例如:
expr 5 + 3
注意運算元(用於計算的數)與運算子之間一定要有空格。
更爲簡單的方式是使用$[]表達式進行數學計算,
例如:
val=$[5+3]
這種形式不要求運算子與運算元之間有空格
+:加法
-:減法
*:乘法
/:除法
%:取餘
=:賦值
通常使用test命令來判斷表達式的真假。
語法格式如下:
test 邏輯表達式
該命令有一個更常用的別名,即左方括號「[」。語法格式如下:
[ 邏輯表達式 ]
中括號兩邊都要有空格
# 整數關係運算符
-eq:相等。檢測兩個數是否相等,相等返回 true。
-ne:不等於。檢測兩個數是否相等,不相等返回 true。
-gt:大於。檢測左邊的數是否大於右邊的,如果是,則返回 true。
-lt:小於。檢測左邊的數是否小於右邊的,如果是,則返回 true。
-ge:大於等於。
-le:小於等於。
# 字串檢測運算子
=:檢測兩個字串是否相等,相等返回 true。
!=:檢測兩個字串是否相等,不相等返回 true。
-z:檢測字串長度是否爲0,爲0返回 true。
-n:檢測字串長度是否爲0,不爲0返回 true。
str:檢測字串是否爲空,不爲空返回 true。這裏不用使用運算子,直接測試字串,
如 [ $a ] 返回 true。
# 檔案測試運算子
-b:檢測檔案是不是塊裝置檔案,如果是,則返回 true。
-c:檢測檔案是不是字元裝置檔案,如果是,則返回 true。
-d:檢測檔案是不是目錄,如果是,則返回 true。
-f:檢測檔案是不是普通檔案(既非目錄,又非裝置檔案),如果是,則返回 true。
-g:檢測檔案是否設定了SGID 位,如果是,則返回 true。
-k:檢測檔案是否設定了粘着位(Sticky Bit),如果是,則返回 true。
-p:檢測檔案是不是具名管道,如果是,則返回 true。
-u:檢測檔案是否設定了SUID 位,如果是,則返回 true。
-r :檢測檔案是否可讀,如果是,則返回 true。
-w:檢測檔案是否可寫,如果是,則返回 true。
-x:檢測檔案是否可執行,如果是,則返回 true。
-s :檢測檔案是否爲空(檔案大小是否大於0),不爲空返回 true。
-e:檢測檔案(包括目錄)是否存在,如果是,則返回 true。
-a:與運算。兩個表達式都爲 true才返回 true。
-o:或運算。有一個表達式爲true就返回 true。
!:非運算。表達式值爲 true 則返回 false,否則返回 true。
# if語句
if [ 條件表達式 ]
then
語句序列1
else
語句序列2
fi
# case語句
case 值 in
模式1)
語句序列1
;;
模式2)
語句序列2
;;
……
模式n)
語句序列n
;;
*)
其他語句序列
esac
#例程
#!/bin/bash
function printit()
{
echo -n "your choice is $1"
}
function help()
{
cat << HELP
echo "this is help manual"
HELP
}
echo "this proogram will print your selection !"
case $1 in
-h) help;;
"one") printit;echo $1 |tr 'a-z' 'A-Z';;
"two") printit;echo $1 |tr 'a-z' 'A-Z';;
"three") printit;echo $1 |tr 'a-z' 'A-Z';;
*) echo "usage $0 {one|two|three}";;
esac
# 回圈語句while
while 測試條件
do
語句序列
done
#例程:
#! /bin/bash
number=0
while [ $number -lt 10 ]
do
echo $number
number=`expr $number + 1`
done
# 回圈語句until
until 測試條件
do
語句序列
done
例程:
#! /bin/bash
var=10
until [ $var -lt 1 ]
do
echo $var
var=$(($var-1))
done
# 回圈語句for
for 變數 [in 列表]
do
語句序列
done
例程:
#! /bin/bash
var=0
for var in 1 2 3 4 5 ###
do
echo "$var"
done ###
# 其他回圈語句
break 語句用來終止一個重複執行的回圈。這種回圈可以是for、until或者while語句構成的回圈。
break [n]
continue 語句跳過回圈體中位於它後面的語句,回到本層回圈的開頭,進行下一次回圈。
continue [n]
exit 語句用來退出一個Shell程式,並設定退出值。
exit [n]
# 函數定義
Shell 函數必須先定義後使用。
[function] 函數名()
{
命令序列
[return 返回值]
}
# 函數呼叫
呼叫函數只需要給出函數名,不需要加括號,就像一般命令那樣使用。
函數名 參數1 參數2 …… 參數n