參考原文http://www.mamicode.com/info-detail-605431.html
1、變量####
1.1 定義變量#####
variableName="value" #變量名前不加$符號,變量名和等會之間不能有空格,變量可重新被定義
num=100
1.2 使用變量#####
v="hello world" #定義變量
echo $v #使用變量在變量名前$符號,花括號是為了識別變量的邊界,可選
echo ${v}
readonly v #將變量設(shè)置為只讀
unset v #刪除變量
1.3 特殊變量#####
$0 當(dāng)前腳本的文件名
$n 傳遞給腳本或函數(shù)的參數(shù)。n 是一個數(shù)字,表示第幾個參數(shù)。例如,第一個參數(shù)是$1,第二個參數(shù)是$2。
$# 傳遞給腳本或函數(shù)的參數(shù)個數(shù)。
$* 傳遞給腳本或函數(shù)的所有參數(shù)。
$@ 傳遞給腳本或函數(shù)的所有參數(shù)。被雙引號(" ")包含時,與 $* 稍有不同,下面將會講到。
$? 上個命令的退出狀態(tài),或函數(shù)的返回值。
$$ 當(dāng)前Shell進(jìn)程ID。對于 Shell 腳本,就是這些腳本所在的進(jìn)程ID。
1.3 變量替換,轉(zhuǎn)移字符#####
#!/bin/bash
a=10
echo -e "Value of a is $a \n"
輸出:
Value of a is 10
# -e 表示對轉(zhuǎn)義字符進(jìn)行替換
# 如果不使用 -e 選項,將會原樣輸出:
Value of a is 10\n
轉(zhuǎn)譯字符
\\ 反斜杠
\a 警報,響鈴
\b 退格(刪除鍵)
\f 換頁(FF),將當(dāng)前位置移到下頁開頭
\n 換行
\r 回車
\t 水平制表符(tab鍵)
\v 垂直制表符
可以使用 echo 命令的 -e 選項禁止轉(zhuǎn)義,默認(rèn)也是不轉(zhuǎn)義的;使用 -n 選項可以禁止插入換行符。
<br />
命令替換
命令替換是指Shell可以先執(zhí)行命令,將輸出結(jié)果暫時保存
#!/bin/bash
DATE=`date` #注意是反斜杠
echo "Date is $DATE"
輸出:
Date is Thu Jul 2 03:59:57 MST 2009
<br />
變量替換
變量替換可以根據(jù)變量的狀態(tài)(是否為空、是否定義等)來改變它的值
${var} #變量本來的值
${var:-word} #如果變量 var 為空或已被刪除(unset),那么返回 word,但不改變 var 的值。
${var:=word} #如果變量 var 為空或已被刪除(unset),那么返回 word,并將 var 的值設(shè)置為 word。
${var:?message #如果變量 var 為空或已被刪除(unset),那么將消息 message 送到標(biāo)準(zhǔn)錯誤輸出,可以用來檢測變量 var 是否可以被正常賦值。
若此替換出現(xiàn)在Shell腳本中,那么腳本將停止運行。
${var:+word} #如果變量 var 被定義,那么返回 word,但不改變 var 的值。
<br />
2、運算符####
Bash 支持很多運算符,包括算數(shù)運算符、關(guān)系運算符、布爾運算符、字符串運算符和文件測試運算符。
原生bash不支持簡單的數(shù)學(xué)運算,但是可以通過其他命令來實現(xiàn),例如 awk 和 expr,expr 最常用。
expr 是一款表達(dá)式計算工具,使用它能完成表達(dá)式的求值操作。
#!/bin/bash
val=`expr 2 + 2`
echo "Total value : $val"
輸出:
Total value : 4
2.1 算術(shù)運算符#####
乘號()*前邊必須加反斜杠(\)才能實現(xiàn)乘法運算
#!/bin/sh
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
輸出:
a + b : 30
#算數(shù)運算符
+ 加法 `expr $a + $b` 結(jié)果為 30。
- 減法 `expr $a - $b` 結(jié)果為 10。
* 乘法 `expr $a \* $b` 結(jié)果為 200。
/ 除法 `expr $b / $a` 結(jié)果為 2。
% 取余 `expr $b % $a` 結(jié)果為 0。
= 賦值 a=$b 將把變量 b 的值賦給 a。
== 相等。用于比較兩個數(shù)字,相同則返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用于比較兩個數(shù)字,不相同則返回 true。 [ $a != $b ] 返回 true。
注意:條件表達(dá)式要放在方括號之間,并且要有空格,例如 [$a==$b] 是錯誤的,必須寫成 [ $a == $b ]。
#關(guān)系運算符
-eq 檢測兩個數(shù)是否相等,相等返回 true。 [ $a -eq $b ] 返回 true。
-ne 檢測兩個數(shù)是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 檢測左邊的數(shù)是否大于右邊的,如果是,則返回 true。 [ $a -gt $b ] 返回 false。
-lt 檢測左邊的數(shù)是否小于右邊的,如果是,則返回 true。 [ $a -lt $b ] 返回 true。
-ge 檢測左邊的數(shù)是否大等于右邊的,如果是,則返回 true。 [ $a -ge $b ] 返回 false。
-le 檢測左邊的數(shù)是否小于等于右邊的,如果是,則返回 true。 [ $a -le $b ] 返回 true。
#布爾運算符
! 非運算,表達(dá)式為 true 則返回 false,否則返回 true。 [ ! false ] 返回 true。
-o 或運算,有一個表達(dá)式為 true 則返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 與運算,兩個表達(dá)式都為 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
#字符串運算符
= 檢測兩個字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 檢測兩個字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 檢測字符串長度是否為0,為0返回 true。 [ -z $a ] 返回 false。
-n 檢測字符串長度是否為0,不為0返回 true。 [ -z $a ] 返回 true。
str 檢測字符串是否為空,不為空返回 true。 [ $a ] 返回 true。
#文件測試運算符
-b file 檢測文件是否是塊設(shè)備文件,如果是,則返回 true。 [ -b $file ] 返回 false。
-c file 檢測文件是否是字符設(shè)備文件,如果是,則返回 true。 [ -b $file ] 返回 false。
-d file 檢測文件是否是目錄,如果是,則返回 true。 [ -d $file ] 返回 false。
-f file 檢測文件是否是普通文件(既不是目錄,也不是設(shè)備文件),如果是,則返回 true。 [ -f $file ] 返回 true。
-g file 檢測文件是否設(shè)置了 SGID 位,如果是,則返回 true。 [ -g $file ] 返回 false。
-k file 檢測文件是否設(shè)置了粘著位(Sticky Bit),如果是,則返回 true。 [ -k $file ] 返回 false。
-p file 檢測文件是否是具名管道,如果是,則返回 true。 [ -p $file ] 返回 false。
-u file 檢測文件是否設(shè)置了 SUID 位,如果是,則返回 true。 [ -u $file ] 返回 false。
-r file 檢測文件是否可讀,如果是,則返回 true。 [ -r $file ] 返回 true。
-w file 檢測文件是否可寫,如果是,則返回 true。 [ -w $file ] 返回 true。
-x file 檢測文件是否可執(zhí)行,如果是,則返回 true。 [ -x $file ] 返回 true。
-s file 檢測文件是否為空(文件大小是否大于0),不為空返回 true。 [ -s $file ] 返回 true。
-e file 檢測文件(包括目錄)是否存在,如果是,則返回 true。
<br />
3、字符串####
3.1 單引號#####
單引號字符串的限制:
- 單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的;
- 單引號字串中不能出現(xiàn)單引號(對單引號使用轉(zhuǎn)義符后也不行)。
雙引號的優(yōu)點:
- 雙引號里可以有變量
- 雙引號里可以出現(xiàn)轉(zhuǎn)義字符
<br />
4、數(shù)組####
4.1 定義數(shù)組#####
array_name=(value0 value1 value2 value3)
array_name=(
value0
value1
value2
value3
)
array_name[0]=value0 #可以不使用連續(xù)的下標(biāo),而且下標(biāo)的范圍沒有限制。
array_name[1]=value1
array_name[2]=value2
4.2 讀取數(shù)組#####
${array_name[index]}
#!/bin/sh
NAME[0]="Zara"
NAME[1]="Qadir"
echo "First Index: ${NAME[0]}"
echo "Second Index: ${NAME[1]}"
使用@ 或 * 可以獲取數(shù)組中的所有元素,例如:
#!/bin/sh
NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Method: ${NAME[*]}"
echo "Second Method: ${NAME[@]}"
輸出:
First Method: Zara Qadir Mahnaz Ayan Daisy
Second Method: Zara Qadir Mahnaz Ayan Daisy
4.2 獲取數(shù)組長度#####
# 取得數(shù)組元素的個數(shù)
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得數(shù)組單個元素的長度
lengthn=${#array_name[n]}