echo "this is the ${num}nd" --變量后接字符組要大括號括起來
fullname="$first_name $last_name $shell" 多個變量想連需要雙引號
cut -b5-9 hosts
expr 2 "+" 3 | tee 5.txt
echo "$SHELL" 雙引號可以打出變量
echo '$SHELL' 單引號不可以打出變量
echo \$SHELL 反斜杠也不可以
單引號使用變量
'${user}'
typeset -u name指定變量大寫
typeset -l name指定變量小寫
單引號內嵌套單引號即可使用變量。
echo輸出保留換行符
echo "${foo}"
單引號字串中不能出現單引號(對單引號使用轉義符后也不行)。
單引號不行,雙引號里可以出現轉義字符
截斷字符串
string="alibaba is a great company"
echo ${string:1:4} #輸出liba
獲取字符串長度
string="abcd"
echo ${#string} #輸出 4
拼接字符串
your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
關系運算符列表
運算符 | 說明 | 舉例 |
---|---|---|
-eq | 檢測兩個數是否相等,相等返回 true。 | [ $a -eq $b ] 返回 true。 |
-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。 |
運算符 | 說明 | 舉例 |
---|---|---|
+ | 加法 | `expr $a + $b` 結果為 30。 |
- | 減法 | `expr $a - $b` 結果為 10。 |
* | 乘法 | `expr $a \* $b` 結果為 200。 |
/ | 除法 | `expr $b / $a` 結果為 2。 |
% | 取余 | `expr $b % $a` 結果為 0。 |
= | 賦值 | a=$b 將把變量 b 的值賦給 a。 |
== | 相等。用於比較兩個數字,相同則返回 true。 | [ $a == $b ] 返回 false。 |
!= | 不相等。用於比較兩個數字,不相同則返回 true。 | [ $a != $b ] 返回 true。 |
運算符 | 說明 | 舉例 |
---|---|---|
! | 非運算,表達式為 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。 |
或 -o ||
and 是 -a &&
運算符 | 說明 | 舉例 |
---|---|---|
= | 檢測兩個字符串是否相等,相等返回 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 | 檢測文件是否是塊設備文件,如果是,則返回 true。 | [ -b $file ] 返回 false。 |
-c file | 檢測文件是否是字符設備文件,如果是,則返回 true。 | [ -b $file ] 返回 false。 |
-d file | 檢測文件是否是目錄,如果是,則返回 true。 | [ -d $file ] 返回 false。 |
-f file | 檢測文件是否是普通文件(既不是目錄,也不是設備文件),如果是,則返回 true。 | [ -f $file ] 返回 true。 |
-g file | 檢測文件是否設置了 SGID 位,如果是,則返回 true。 | [ -g $file ] 返回 false。 |
-k file | 檢測文件是否設置了粘着位(Sticky Bit),如果是,則返回 true。 | [ -k $file ] 返回 false。 |
-p file | 檢測文件是否是具名管道,如果是,則返回 true。 | [ -p $file ] 返回 false。 |
-u file | 檢測文件是否設置了 SUID 位,如果是,則返回 true。 | [ -u $file ] 返回 false。 |
-r file | 檢測文件是否可讀,如果是,則返回 true。 | [ -r $file ] 返回 true。 |
-w file | 檢測文件是否可寫,如果是,則返回 true。 | [ -w $file ] 返回 true。 |
-x file | 檢測文件是否可執行,如果是,則返回 true。 | [ -x $file ] 返回 true。 |
-s file | 檢測文件是否為空(文件大小是否大於0),不為空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 檢測文件(包括目錄)是否存在,如果是,則返回 true。 | [ -e $file ] 返回 true。 |
if [ ! -d $num ] 如果不存在目錄$num
變量 | 含義 |
---|---|
$0 | 當前腳本的文件名 |
$n | 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。 |
$# | 傳遞給腳本或函數的參數個數。 |
$* | 傳遞給腳本或函數的所有參數。 |
$@ | 傳遞給腳本或函數的所有參數。被雙引號(" ")包含時,與 $* 稍有不同,下面將會講到。 |
$? | 上個命令的退出狀態,或函數的返回值。 |
$$ | 當前Shell進程ID。對於 Shell 腳本,就是這些腳本所在的進程ID。 |
變量替換運算符
${varname:-word} 如果varname的值存在且非null,返回varname的值;未定義,則輸出為word(用於未定義變量返回默認值)
${varname:=word} 如果varname的值在且非null,返回varname的值;未定義,則輸出為word,並且varname被設置為word(用於未定義變量設置默認變量)
${varname:?message} 如果varname的值在且非null,返回varname的值;未定義,則輸出為varname:undefined!,然后退出;如果省略message這種提示消息,則返回parameter null or not set (用於未定義變量而導致的錯誤)
${varname:+1} 如果varname的值在且非null,則返回1;未定義返回null(用於測試變量存在)
以上每個冒號都是可選的,如果省略冒號,則將每個定義中的存在且非NULL改為存在,就是變量運算符只判斷變量是否存在
假設path=/home/prince/desktop/long.file.name
從開頭刪除匹配值
${varname#pattern} 從變量值開頭匹配刪除 # 后最短匹配的部分
${varname#pattern} 從變量值開頭匹配刪除 # 后最短匹配的部分
${path#/*/}輸出就是prince/desktop/long.file.name
${varname##pattern} 從變量值開頭匹配刪除 # 后最長匹配的部分
${path##/*/}輸出就是long.file.name
從結尾刪除匹配值
${varname%pattern} 從變量值尾部匹配刪除 % 后最短匹配的部分
${path%.*}輸出就是/home/prince/desktop/long.file
${varname%%pattern} 從變量值尾部匹配刪除 % 后最長匹配的部分
${path%%.*}輸出就是/home/prince/desktop/long
替換匹配值
${varname/pattern/string}從變量值開頭匹配遇到的第一部分pattern替換成string
${path/prince/ollir}輸出就是/home/ollir/desktop/long.file.name
${varname//pattern/string}從變量值開頭匹配遇到的所有pattern替換成string
定義數組
在Shell中,用括號來表示數組,數組元素用“空格”符號分割開。定義數組的一般形式為:
在Shell中,用括號來表示數組,數組元素用“空格”符號分割開。定義數組的一般形式為:
array_name=(value0 value1 value2 value3)
或者
array_name=(
value0
value1
value2
value3
)
單獨定義數組的各個分量:
- array_name[0]=value0
- array_name[1]=value1
- array_name[2]=value2
讀取數組
讀取數組元素值的一般格式是:${array_name[index]}
#!/bin/sh
NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Index: ${NAME[0]}"
echo "Second Index: ${NAME[1]}"
輸出
First Index: Zara
Second Index: Qadir
使用@ 或 * 可以獲取數組中的所有元素:
${array_name[*]}
${array_name[@]}
# 取得數組元素的個數
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得數組單個元素的長度
lengthn=${#array_name[n]}
參考:http://c.biancheng.net/cpp/view/7006.html