Shell 傳遞參數
我們可以在執行 Shell 腳本時,向腳本傳遞參數,腳本內獲取參數的格式爲:$n。n 代表一個數字,1 爲執行腳本的第一個參數,2 爲執行腳本的第二個參數,以此類推……
實例
以下實例我們向腳本傳遞三個參數,並分別輸出,其中 $0 爲執行的文件名:
#!/bin/bash
echo "Shell 傳遞參數實例!";
echo "執行的文件名:$0";
echo "第一個參數爲:$1";
echo "第二個參數爲:$2";
echo "第三個參數爲:$3";
爲腳本設置可執行權限,並執行腳本,輸出結果如下所示:
Shell 傳遞參數實例!
執行的文件名:test.sh
第一個參數爲:1
第二個參數爲:2
第三個參數爲:3
另外,還有幾個特殊字符用來處理參數:
#!/bin/bash
echo "Shell 傳遞參數實例!";
echo "第一個參數爲:$1";
echo "參數個數爲:$#";
echo "傳遞的參數作爲一個字符串顯示:$*";
執行腳本,輸出結果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2 3
Shell 傳遞參數實例!
第一個參數爲:1
參數個數爲:3
傳遞的參數作爲一個字符串顯示:1 2 3
$* 與 $a 區別:
#!/bin/bash
echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
done
echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done
執行腳本,輸出結果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3
Shell 數組
數組中可以存放多個值。Bash Shell 只支持一維數組(不支持多維數組),初始化時不需要定義數組大小(與 PHP 類似)。
與大部分編程語言類似,數組元素的下標由0開始。
Shell 數組用括號來表示,元素用”空格”符號分割開,語法格式如下:
array_name=(value1 ... valuen)
實例
my_array=(A B "C" D)
我們也可以使用下標來定義數組:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
讀取數組
讀取數組元素值的一般格式是:
${array_name[index]}
實例
#!/bin/bash
my_array=(A B "C" D)
echo "第一個元素爲: ${my_array[0]}"
echo "第二個元素爲: ${my_array[1]}"
echo "第三個元素爲: ${my_array[2]}"
echo "第四個元素爲: ${my_array[3]}"
執行腳本,輸出結果如下所示:
第一個元素爲: A
第二個元素爲: B
第三個元素爲: C
第四個元素爲: D
獲取數組中的所有元素
使用@ 或 * 可以獲取數組中的所有元素,例如:
#!/bin/bash
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "數組的元素爲: ${my_array[*]}"
echo "數組的元素爲: ${my_array[@]}"
執行腳本,輸出結果如下所示:
$ chmod +x test.sh
$ ./test.sh
數組的元素爲: A B C D
數組的元素爲: A B C D
獲取數組的長度
獲取數組長度的方法與獲取字符串長度的方法相同,例如:
#!/bin/bash
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "數組元素個數爲: ${#my_array[*]}"
echo "數組元素個數爲: ${#my_array[@]}"
執行腳本,輸出結果如下所示:
$ chmod +x test.sh
$ ./test.sh
數組元素個數爲: 4
數組元素個數爲: 4
Shell 基本運算符
Shell 和其他編程語言一樣,支持多種運算符,包括:
原生bash不支持簡單的數學運算,但是可以通過其他命令來實現,例如 awk 和 expr,expr 最常用。
expr 是一款表達式計算工具,使用它能完成表達式的求值操作。
例如,兩個數相加(注意使用的是反引號 ` 而不是單引號 ‘):
#!/bin/bash
val=`expr 2 + 2`
echo "兩數之和爲 : $val"
執行腳本,輸出結果如下所示:
兩數之和爲 : 4
兩點注意:
算術運算符
下表列出了常用的算術運算符,假定變量 a 爲 10,變量 b 爲 20:
注意:條件表達式要放在方括號之間,並且要有空格,例如: [
實例
算術運算符實例如下:
#!/bin/bash
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a 等於 b"
fi
if [ $a != $b ]
then
echo "a 不等於 b"
fi
執行腳本,輸出結果如下所示:
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等於 b
注意:
乘號(*)前邊必須加反斜槓(\)才能實現乘法運算;
if...then...fi 是條件語句,後續將會講解。
關係運算符
關係運算符只支持數字,不支持字符串,除非字符串的值是數字。
下表列出了常用的關係運算符,假定變量 a 爲 10,變量 b 爲 20:
實例
關係運算符實例如下:
#!/bin/bash
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等於 b"
else
echo "$a -eq $b: a 不等於 b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b: a 不等於 b"
else
echo "$a -ne $b : a 等於 b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: a 大於 b"
else
echo "$a -gt $b: a 不大於 b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: a 小於 b"
else
echo "$a -lt $b: a 不小於 b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b: a 大於或等於 b"
else
echo "$a -ge $b: a 小於 b"
fi
if [ $a -le $b ]
then
echo "$a -le $b: a 小於或等於 b"
else
echo "$a -le $b: a 大於 b"
fi
執行腳本,輸出結果如下所示:
10 -eq 20: a 不等於 b
10 -ne 20: a 不等於 b
10 -gt 20: a 不大於 b
10 -lt 20: a 小於 b
10 -ge 20: a 小於 b
10 -le 20: a 小於或等於 b
布爾運算符
下表列出了常用的布爾運算符,假定變量 a 爲 10,變量 b 爲 20:
實例
布爾運算符實例如下:
#!/bin/bash
a=10
b=20
if [ $a != $b ]
then
echo "$a != $b : a 不等於 b"
else
echo "$a != $b: a 等於 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a -lt 100 -a $b -gt 15 : 返回 true"
else
echo "$a -lt 100 -a $b -gt 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
echo "$a -lt 100 -o $b -gt 100 : 返回 true"
else
echo "$a -lt 100 -o $b -gt 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
echo "$a -lt 100 -o $b -gt 100 : 返回 true"
else
echo "$a -lt 100 -o $b -gt 100 : 返回 false"
fi
執行腳本,輸出結果如下所示:
10 != 20 : a 不等於 b
10 -lt 100 -a 20 -gt 15 : 返回 true
10 -lt 100 -o 20 -gt 100 : 返回 true
10 -lt 100 -o 20 -gt 100 : 返回 false
邏輯運算符
以下介紹 Shell 的邏輯運算符,假定變量 a 爲 10,變量 b 爲 20:
實例
邏輯運算符實例如下:
#!/bin/bash
a=10
b=20
if [[ $a -lt 100 && $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
執行腳本,輸出結果如下所示:
返回 false
返回 true
字符串運算符
下表列出了常用的字符串運算符,假定變量 a 爲 “abc”,變量 b 爲 “efg”:
實例
字符串運算符實例如下:
#!/bin/bash
a="abc"
b="efg"
if [ $a = $b ]
then
echo "$a = $b : a 等於 b"
else
echo "$a = $b: a 不等於 b"
fi
if [ $a != $b ]
then
echo "$a != $b : a 不等於 b"
else
echo "$a != $b: a 等於 b"
fi
if [ -z $a ]
then
echo "-z $a : 字符串長度爲 0"
else
echo "-z $a : 字符串長度不爲 0"
fi
if [ -n $a ]
then
echo "-n $a : 字符串長度不爲 0"
else
echo "-n $a : 字符串長度爲 0"
fi
if [ $a ]
then
echo "$a : 字符串不爲空"
else
echo "$a : 字符串爲空"
fi
執行腳本,輸出結果如下所示:
abc = efg: a 不等於 b
abc != efg : a 不等於 b
-z abc : 字符串長度不爲 0
-n abc : 字符串長度不爲 0
abc : 字符串不爲空
文件測試運算符
文件測試運算符用於檢測 Unix 文件的各種屬性。
屬性檢測描述如下:
實例
變量 file 表示文件”/var/www/runoob/test.sh”,它的大小爲100字節,具有 rwx 權限。下面的代碼,將檢測該文件的各種屬性:
#!/bin/bash
file="/var/www/runoob/test.sh"
if [ -r $file ]
then
echo "文件可讀"
else
echo "文件不可讀"
fi
if [ -w $file ]
then
echo "文件可寫"
else
echo "文件不可寫"
fi
if [ -x $file ]
then
echo "文件可執行"
else
echo "文件不可執行"
fi
if [ -f $file ]
then
echo "文件爲普通文件"
else
echo "文件爲特殊文件"
fi
if [ -d $file ]
then
echo "文件是個目錄"
else
echo "文件不是個目錄"
fi
if [ -s $file ]
then
echo "文件不爲空"
else
echo "文件爲空"
fi
if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在"
fi
執行腳本,輸出結果如下所示:
文件可讀
文件可寫
文件可執行
文件爲普通文件
文件不是個目錄
文件不爲空
文件存在
Shell echo命令
Shell 的 echo 指令與 PHP 的 echo 指令類似,都是用於字符串的輸出。命令格式:
echo string
您可以使用echo實現更復雜的輸出格式控制。
1.顯示普通字符串:
echo "It is a test"
這裏的雙引號完全可以省略,以下命令與上面實例效果一致:
echo It is a test
2.顯示轉義字符
echo "\"It is a test\""
結果將是:
"It is a test"
同樣,雙引號也可以省略
3.顯示變量
read 命令從標準輸入中讀取一行,並把輸入行的每個字段的值指定給 shell 變量
#!/bin/sh
read name
echo "$name It is a test"
以上代碼保存爲 test.sh,name 接收標準輸入的變量,結果將是:
[root@www ~]# sh test.sh
OK #標準輸入
OK It is a test #輸出
4.顯示換行
echo -e "OK! \n" # -e 開啓轉義
echo "It it a test"
輸出結果:
OK!
It it a test
5.顯示不換行
#!/bin/sh
echo -e "OK! \c" # -e 開啓轉義 \c 不換行
echo "It is a test"
輸出結果:
OK! It is a test
6.顯示結果定向至文件
echo "It is a test" > myfile
7.原樣輸出字符串,不進行轉義或取變量(用單引號)
echo '$name\"'
輸出結果:
$name\"
8.顯示命令執行結果
echo `date`
結果將顯示當前日期
Fri May 20 13:11:31 UTC 2016
Shell printf 命令
printf 命令模仿 C 程序庫(library)裏的 printf() 程序。
標準所定義,因此使用printf的腳本比使用echo移植性好。
printf 使用引用文本或空格分隔的參數,外面可以在printf中使用格式化字符串,還可以制定字符串的寬度、左右對齊方式等。默認printf不會像 echo 自動添加換行符,我們可以手動添加 \n。
printf 命令的語法:
printf format-string [arguments...]
參數說明:
實例如下:
$ echo "Hello, Shell"
Hello, Shell
$ printf "Hello, Shell\n"
Hello, Shell
$
接下來,我來用一個腳本來體現printf的強大功能:
#!/bin/bash
printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 楊過 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
執行腳本,輸出結果如下所示:
姓名 性別 體重kg
郭靖 男 66.12
楊過 男 48.65
郭芙 女 47.99
%s %c %d %f都是格式替代符
%-10s 指一個寬度爲10個字符(-表示左對齊,沒有則表示右對齊),任何字符都會被顯示在10個字符寬的字符內,如果不足則自動以空格填充,超過也會將內容全部顯示出來。
%-4.2f 指格式化爲小數,其中.2指保留2位小數。
更多實例:
#!/bin/bash
# format-string爲雙引號
printf "%d %s\n" 1 "abc"
# 單引號與雙引號效果一樣
printf '%d %s\n' 1 "abc"
# 沒有引號也可以輸出
printf %s abcdef
# 格式只指定了一個參數,但多出的參數仍然會按照該格式輸出,format-string 被重用
printf %s abc def
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g h i j
# 如果沒有 arguments,那麼 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n"
執行腳本,輸出結果如下所示:
1 abc
1 abc
abcdefabcdefabc
def
a b c
d e f
g h i
j
and 0
printf的轉義序列
實例
$ printf "a string, no processing:<%s>\n" "A\nB"
a string, no processing:<A\nB>
$ printf "a string, no processing:<%b>\n" "A\nB"
a string, no processing:<A
B>
$ printf "www.runoob.com \a"
www.runoob.com $ #不換行