1)shell腳本第一行必須是如下格式:
#!/bin/sh
符號#!用來指定該腳本文件的解析程序。上面就是使用/bin/sh來解析該腳本,
編輯好後,要執行該腳本,還必須有可執行屬性:
chmod +x filename
注:可在終端輸入 cat /etc/passwd 指令查看linux爲各用戶預設的shell解析器。
如: root:x:0:0:root:/root:/bin/bash
wm:x:1000:1000:wm,,,:/home/wm:/bin/bash
表示爲root用戶和wm用戶預設的bash解析。
2)#開頭表示註釋,直到該行結束
3)變量沒有類型,所有變量都由字符串組成,調用時前面加$,如:
#!/bin/sh
#set variable a
a="hello word"
# print a
echo "A is:"
echo $a
4)有時候變量名容易與其他文字混淆,如:
num=2
echo "this is the $numnd"
結果將只會輸出: this is the ,因爲shell會去搜索變量numnd的值,這個變
量是沒有定義值得。可使用花括號解決上述問題:
num=2
echo "this is the ${num}nd"
結果會輸出: this is the 2nd
5)默認變量:
$# :傳入腳本的命令行參數個數
$* :所有命令行參數值,在各個參數之間留有空格
$0 :命令本身(shell文件名)
$1 :第一個命令行參數
$2 :第二個命令行參數
如:腳本文件名爲 example,內容如下:
#!/bin/sh
echo "number of vars:"$#
echo "values of vars:"$*
echo "value of cmd:"$0
echo "value of var1:"$1
echo "value of var2:"$2
echo "value of var3:"$3
運行 ./example 1 2 3 (表示執行example腳本並傳入1,2,3三個參數)
輸出: number of vars:3
values of vars:1 2 3
value of cmd:./example 1 2 3
value of var1:1
value of var2:2
value of var3:3
運行 sh example 1 2 3
輸出: number of vars:3
values of vars:1 2 3
value of cmd:example 1 2 3
value of var1:1
value of var2:2
value of var3:3
注意:兩種運行方式中$0的區別。
6)變量首次被賦值是加上local關鍵字可以聲明一個局部變量。如:
#!/bin/sh
hello="var1"
echo $hello
function func1 {
local hello="var2"
echo $hello
}
func1
echo $hello
注意:“function func1 {”中func1和“{”之間必須要加個空格,否則會報
錯。
輸出: var1
var2
var1
7)變量注意事項:
變量賦值是,“=”左右不能有空格;
BASH中的語句結尾不需要分號。
8)if語句格式:
第一種: if [ expression ]
then
#code block
fi
第二種: if [ expression ]
then
#code block
else
#code block
fi
第三種: if [ expression ]
then
#code block
else if [ expression ]
then
#code block
else
#code block
fi
fi
注意:“[”和“]”左右兩邊必須要留有有空格或回車。
9)if常用的比較操作符:
比較操作 整數操作 字符串操作
相同 -eq =
不同 -ne !=
大於 -gt >
小於 -lt <
大於等於 -ge
小於等於 -le
爲空 -z
不爲空 -n
例:
比較整數a和b是否相等: if [ $a = $b ] #也可用-eq
判斷整數a是否大於整數b: if [ $a -gt $b ]
比較字符串a和字符串b是否相等: if [ $a = $b ]
判斷字符串a是否爲空: if [ -z $a ]
注意:操作符(包括“=”,這裏不是賦值符)左右都有空格。
10)文件判斷符:
-e 文件已經存在
-f 文件是普通文件
-s 文件大小不爲零
-d 文件是一個目錄
-r 文件對當前用戶可以讀取
-w 文件對當前用戶可以寫入
-x 文件對當前用戶可以執行
如: #!/bin/sh
folder=/home
[ -r "$folder" ] && echo "Can read $folder"
[ -f "$folder" ] || echo "this is not file"
注意:“&&”表示前面判斷爲真時才執行後面語句;“||”表示前面判斷爲
假時才執行後面的判斷;變量內部不存在空格時,加不加雙引號都一樣,即
folder=/home和folder="/home"效果一樣
11)for循環基本結構:
for var in [list]
do
#code block
done
其中&var(var是變量名)是循環控制變量,[list]是var需要遍歷的一個集合,do/done對包含了循環體,
相當於C語言中的一對大括號。另外如果do和 for被寫在同一行,必須在do前面加上“;”。如: for var in [list];do
(注意:“;”左右空格可有可無,不影響)。
例如: #!/bin/sh
for day in Sun Mon Tue Wed Thu Fri Sat
do
echo $day
done
輸出: Sun
Mon
Tue
Wed
Tue
Fri
Sat
注意,如果列表被包含在一對雙引號中,則表示一個元素,如:
#!/bin/sh
for day in "Sun Mon Tue Wed Thu Fri Sat"
do
echo $day
done
則輸出: Sun Mon Tue Wed Thu Fri Sat
注意:for循環所在行變量day是不加“$”的(相當於給變量賦值階段),而
在循環體內,變量$day是必須加上“$”符號的(相當於調用階段)。
12)while循環基本結構:
while [ condition ]
do
#code block
done
until循環基本結構:
until [ condition ]
do
#code block
done
注意:while和until的區別在於while是爲真時執行,until是爲假是執行。
13)case語句格式:
case "$var" in
condition1)
;;
condition2)
;;
*)
default statments;;
esac
例: #!/bin/sh
echo "Press your keyboard, then the data return."
read Keypress
case "$Keypress" in
[A-Z]) echo "Uppercase letter";;
[a-z]) echo "Lowercase letter";;
[0-9]) echo "Digit";;
*) echo "Puncturation, whitespace, or other";;
esac
注意:read是shell腳本語言提供的一個函數,其功能是“等待,直到你在
盤輸入一個字符,然後賦值給後面的變量”。
-------------------------------------------------------------------------------------------------------------------
變量內容有空格時必須要加雙引號(" ")或單引號(' '),但這兩者是有區別的:
雙引號內的特殊字符如$等,可以保持原有特性,如:
var="lang is $LANG" 則 echo $var 可得 lang is en_US
單引號內的特殊字符僅爲一般字符,如:
var='lang is $LANG' 則 echo $var 可得 lang is $LANG