3.1 shell中的特殊位置參數變量
常用的特殊位置參數變量說明
位置變量 | 作用說明 |
$0 | 獲取當前執行的shell腳本的文件名,如果執行腳本包含了路徑,那麼就包括腳本路徑 |
$n | 獲取當前執行的shell腳本的第n個參數值,n=1..9,當n爲0時表示腳本的文件名;如果n大於9,則用大括號括起來,例如${10},接的參數以空格隔開 |
$# | 獲取當前執行的shell腳本後面接的參數的總個數 |
$* | 獲取當前shell腳本所有傳參的參數,不加引號和$@相同;如果給$*加上雙引號,例如:”$*”,則表示將所有的參數視爲單個字符串,相當於”$1 $2 $3” |
$@ | 獲取當前shell腳本所有傳參的參數,不加引號和$*相同;如果給$@加上雙引號,例如:”$@”,則表示將所有的參數視爲不同的獨立字符串,相當於”$1” “$2” “$3” “…”。這是將多參數傳遞給其他程序的最佳方式,因爲它會保留所有的內嵌在每個參數的任何空白。當$@和$*都加雙引號時,兩者是有區別的;都不加雙引號時,兩者無區別。 |
1、$1 $2 …$9 ${10} ${11}..特殊變量實踐
[root@wangxian script]# cat n.sh echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} [root@wangxian script]# sh n.sh a a [root@wangxian script]# sh n.sh a b a b [root@wangxian script]# sh n.sh a b c a b c [root@wangxian script]# sh n.sh "a b" b a b b [root@wangxian script]# echo \${1..11} >n.sh [root@wangxian script]# cat n.sh $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11
當參數數字大於9時,需要用大括號將數字括起來
[root@wangxian script]# cat n.sh $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11}
2、$0特殊變量的作用及變量實踐
$0的作用爲取出執行腳本的名稱(包括路徑)
[root@wangxian script]# cat path.sh echo $0 [root@wangxian script]# sh path.sh path.sh [root@wangxian script]# sh /server/script/path.sh /server/script/path.sh
利用dirname及basename命令單獨獲取名稱或路徑
[root@wangxian script]# dirname /server/script/path.sh /server/script [root@wangxian script]# basename /server/script/path.sh path.sh
[root@wangxian script]# cat path.sh dirname $0 basename $0 [root@wangxian script]# sh /server/script/path.sh /server/script path.sh
$0這個位置參數的系統生產場景案例:
[root@nfs-server ~]# tail -6 /etc/init.d/rpcbind echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart|try-restart}" RETVAL=2 ;; esac exit $RETVAL [root@nfs-server ~]# /etc/init.d/rpcbind
Usage: /etc/init.d/rpcbind {start|stop|status|restart|reload|force-reload|condrestart|try-restart}
上文就是$0從腳本命令行獲取的值
3、$#特殊變量獲取腳本傳參個數的實踐
通過$#獲取腳本傳參的個數
[root@wangxian script]# cat n.sh echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} echo $# [root@wangxian script]# sh n.sh wangxian lile xiaoming wangxian lile xiaoming 3
4、$*和$@特殊變量功能及區別說明
[root@wangxian script]# set -- "I am" handsome boy [root@wangxian script]# echo $1 I am [root@wangxian script]# echo $2 handsome [root@wangxian script]# echo $* I am handsome boy [root@wangxian script]# echo $@ I am handsome boy [root@wangxian script]# for i in $*;do echo $i;done I am handsome boy [root@wangxian script]# for i in $@;do echo $i;done I am handsome boy
測試”$*”和”$@”區別(帶有雙引號)
[root@wangxian script]# for i in "$@";do echo $i;done I am handsome boy [root@wangxian script]# for i in "$*";do echo $i;done I am handsome boy
3.2 shell進程中的特殊狀態變量
位置變量 | 作用說明 |
$? | 獲取執行上一個指令的執行狀態返回值(0爲成功,非0爲失敗),這個變量最常用 |
$$ | 獲取當前執行的shell腳本的進程號PID,不常用,瞭解 |
$! | 獲取上一個在後臺工作的進程的進程號PID,不常用,瞭解 |
$_ | 獲取在此之前執行的命令或腳本的最後一個參數,不常用,瞭解 |
在企業場景下,”$?”返回值的用法:
1)判斷命令、腳本或函數等程序是否執行成功
2)若在腳本中調用執行“exit數字”,則會返回這個數字給“$?”變量
3)如果是在函數裏,則通過“return數字”把這個數字以函數返回值的形式傳給“$?”
[root@nfs-server ~]# sed -n '63,73p' /etc/init.d/rpcbind stop() { echo -n $"Stopping $prog: " killproc $prog RETVAL=$? echo [ $RETVAL -eq 0 ] && { rm -f /var/lock/subsys/$prog rm -f /var/run/rpcbind* } return $RETVAL }
3.3 bash shell 內置變量命令
常用的內置命令:echo、eval、exec、export、read、shift
echo 在屏幕上輸出信息
echo的參數信息說明
-n 不換行輸出內容
-e 解析轉義字符
轉義字符:
\n 換行;
\r 回車;
\t 製表符(tab);
\b 退格;
\v 縱向製表符
eval
命令格式:eval args
功能:當shell程序執行到eval語句時,shell讀入參數args,並將它們組合成一個新的命令,然後執行。
[root@wangxian script]# cat noeval.sh echo \$$# [root@wangxian script]# sh noeval.sh x1 x2 $2 [root@wangxian script]# cat eval.sh eval "echo \$$# " [root@wangxian script]# sh eval.sh x1 x2 x2
exec
功能:exec命令能夠在不創建新的子進程的前提下,轉去執行指定的命令,當指定的命令執行完畢後,該進程(最初的shell)就終止了
read
從標準輸入讀取字符串等信息,傳給shell程序內部定義的變量
shift
功能:shift命令的作用是將位置參數$1、$2、$3等進行左移,執行一次刪除一個參數
exit
退出shell程序,在exit之後可以有選擇地指定一個數位作爲返回狀態
3.4 shell變量子串知識及實踐提取
變量子串介紹與實踐
ID | 表達式 | 說明 |
1 | ${parameter} | 返回變量$parameter的內容 |
2 | ${#parameter} | 返回變量$parameter內容的長度,也適用於特殊變量 |
3 | ${parameter:offset} | 在變量${parameter}中,從位置offset之後開始提取子串到結尾 |
4 | ${parameter:offset:length} | 在變量${parameter}中,從位置offset之後開始提取長度爲length的子串 |
5 | ${parameter#word} | 從變量${parameter}開頭開始刪除最短匹配的word子串 |
6 | ${parameter##word} | 從變量${parameter}開頭開始刪除最長匹配的word子串 |
7 | ${parameter%word} | 從變量${parameter}結尾開始刪除最短匹配的word子串 |
8 | ${parameter%%word} | 從變量${parameter}結尾開始刪除最長匹配的word子串 |
9 | ${parameter/pattern/string} | 使用string代替第一個匹配的pattern |
10 | ${parameter//pattern/string} | 使用string代替所有匹配的pattern |
打印變量值的長度
[root@wangxian script]# OLDBOY="I am wangxian" [root@wangxian script]# echo ${OLDBOY} I am wangxian [root@wangxian script]# echo ${#OLDBOY} 13
從第2個字符之後截取變量的內容
[root@wangxian script]# echo ${OLDBOY:2} am wangxian
從第2個字符之後開始截取,只截取2個字符
[root@wangxian script]# echo ${OLDBOY:2:2} am
使用oldgirl字符串代替變量$OLDBOY匹配的oldboy字符串
[root@wangxian script]# OLDBOY="I am oldboy,yes,oldboy" [root@wangxian script]# echo $OLDBOY I am oldboy,yes,oldboy [root@wangxian script]# echo ${OLDBOY/oldboy/oldgirl} I am oldgirl,yes,oldboy [root@wangxian script]# echo ${OLDBOY//oldboy/oldgirl} I am oldgirl,yes,oldgirl
變量子串應用案例
文件改名
[root@wangxian script]# touch stu_10111_finished.jpg [root@wangxian script]# f=stu_10111_finished.jpg [root@wangxian script]# echo ${f//_finished/} stu_10111.jpg [root@wangxian script]# mv $f `echo ${f//_finished/}`
3.5 shell特殊擴展變量
表達式 | 說明 |
${parameter:-word} | 如果parameter的變量值爲空或未賦值,則會返回word字符串並替代變量的值。 用途:如果變量未定義,則返回備用的值,防止變量爲空值或因未定義而導致異常 |
${parameter:=word} | 如果parameter的變量值爲空或未賦值,則設置這個變量值爲word,並返回其值。位置變量和特殊變量不適用 用途:基本同上,但該變量又額外給parameter變量賦值了 |
${parameter:?word} | 如果parameter的變量值爲空或未賦值,那麼word字符串將被作爲標準錯誤輸出,否則輸出變量的值。 用途:用於捕捉由於變量未定義而導致的錯誤,並退出程序 |
${parameter:+word} | 如果parameter的變量值爲空或未賦值,則什麼都不做,否則word字符串將替代變量的值 |
${parameter:-word}功能實踐
示例1:
[root@wangxian script]# echo $test [root@wangxian script]# result=${test:-UNSET} [root@wangxian script]# echo $result UNSET [root@wangxian script]# echo ${test} [root@wangxian script]#
結論:對於${test:-UNSET},當test變量沒值時,就返回變量結尾設置的UNSET字符串
示例2:
[root@wangxian script]# test=wangxian [root@wangxian script]# echo $test wangxian [root@wangxian script]# result=${test:-UNSET} [root@wangxian script]# echo $result wangxian
結論:當test變量有值時,打印result變量,返回test變量的內容
${parameter:=word}功能實踐
示例:
[root@wangxian ~]# echo $test [root@wangxian ~]# result=${test:=UNSET} [root@wangxian ~]# echo $result UNSET [root@wangxian ~]# echo $test UNSET
結論:當變量值result裏test沒有定義時,會給變量result賦值“:=”後面的內容,同時會把內容賦值給test
${parameter:?word}功能實踐
示例:
[root@wangxian ~]# echo ${key:?not defined} -bash: key: not defined [root@wangxian ~]# echo ${key?not defined} -bash: key: not defined [root@wangxian ~]# key=1 [root@wangxian ~]# echo ${key:?not defined} 1 [root@wangxian ~]# echo ${key?not defined} 1
結論:當key沒定義時,報錯;可以用於設定由於變量未定義而報錯的具體內容,如:not defined
${parameter:+word}功能實踐
示例:
[root@wangxian ~]# xianren=${wangxian:+word} [root@wangxian ~]# echo $xianren [root@wangxian ~]# wangxian=22 [root@wangxian ~]# xianren=${wangxian:+word} [root@wangxian ~]# echo $xianren word [root@wangxian ~]# xianren=${wangxian:+this is ok} [root@wangxian ~]# echo $xianren this is ok
此功能可用於測試變量(wangxian的位置)是否存在,如果xianren的值有,則證明wangxian變量有值