shell中的特殊參數
1. 位置參數
$ 變量名
#!/bin/bash
echo $1 #接收一個參數並輸出
#!/bin/bash
echo $1,$2 #接收兩個參數並輸出
注意:
1.有一個$符只能接收一個參數,後面輸入的不會被接收
2.如果用雙引號括起來代表一個參數。例如:“hello word”
多個位置參數
腳本:
#!/bin/bash
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
執行:
位置參數的數字大於9後,輸出的內容就不對了。這是因爲解釋器把10當作1和0兩個數字來看。
當位置參數的數字大於9時:需要用花括號將數字括起來
改寫後的腳本:
#!/bin/bash
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}
執行:
2. 獲取腳本的名稱及路徑
2.1 $0獲取
echo $0
用$0來獲取時:
若不帶路徑執行腳本,那麼輸出結果就是腳本的名字;
若使用全路徑執行腳本,那麼輸出結果就是全路徑加上腳本名
2.2 單獨獲取名稱和路徑
#!/bin/bash
dirname $0 #獲取路徑
basename $0 #獲取腳本名
若不帶路徑執行腳本,輸出的結果爲".",代表當前路徑
若帶路徑執行腳本,輸出的結果爲路徑名
3. $#獲取腳本傳參的個數
#!/bin/bash
echo $1 $2 $3 $4 $5 $6 $7 $8 $9
echo $# # $#獲取腳本傳參的個數
傳遞了a到z 26個參數,但是隻接收了9個變量,所以打印9個字符
4. set設置位置參數
set -- 參數
5. $* 和 $@的區別
在Shell中, $*和 $@都表示參數列表中的所有參數,它們在具體使用中會有哪些不同呢?
#!/bin/bash
foo(){
echo $*
}
bar(){
echo $@
}
foo 1 2 3 4
bar 1 2 3 4
輸出沒有任何區別,那麼 $* 和 $@ 的區別到底是什麼呢?
當 $* 和 $@ 被雙引號(" ")包含時, $* 會將所有的參數作爲一個整體,以” $1 $2 … $n “ 的形式輸出所有參數。
而 $@ 會將各個參數分開,以” $1 “ " $2 " … " $n "的形式輸出所有參數。
#!/bin/bash
test(){
echo "未加引號,二者相同"
echo $*
echo $@
echo "加入引號後對比"
echo "-------"
for N in "$*"
do
echo $N
done
echo "########"
for N in "$@"
do
echo $N
done
}
test 11 22 33
由此可見:
$*輸出的格式爲" $1 $2 $3 "
$@輸出的格式爲"$1" “$2” “$3”
6. shift用於參數的移動
shift命令用於對於參數的移動(左移),通常用於在不知道傳入參數個數的情況下依次遍歷每個參數然後進行相應處理
#!/bin/bash
while [ $# != 0 ];do
echo "第一個參數爲:$1,參數的個數爲:$#"
shift
done
shift命令每執行一次,變量的個數($#)減1;之前的$1變量被銷燬,之後的$2就變成了$1,而變量值提前一位
7. $?獲取函數的返回值
當一個進程執行完畢時,該進程會提供一個退出碼(一個整數)表明它準備退出的原因。按照慣例,0用來表明正常或者說“成功”的終止。也就是說我們在執行echo $?時返回的值就是進程的退出碼,這個退出碼是由剛剛執行完的進程提供給系統內核的。
$?是一個特殊變量,同來獲取上一個命令的退出狀態,或者上一個函數的返回值。所謂退出狀態,就是上一個命令執行後的返回結果。退出狀態是一個數字,一般情況下大部分命令執行成功會返回0,失敗返回1,這和c語言中的main()函數是類似的。
理解函數的返回值:
應用:判斷參數是否正確
#!/bin/bash
if [ "$1" == 100 ]
then
exit 3 #參數正確 退出狀態爲0
else
exit 1 #參數不正確 退出狀態爲1
fi
應用:$? 獲取函數的返回值
#!/bin/bash
add(){
return `expr $1 + $2`
}
add 23 50 #調用函數
echo $?