第3章 shell變量知識進階與實踐

3.1 shell中的特殊位置參數變量

             常用的特殊位置參數變量說明

位置變量

作用說明

$0

獲取當前執行的shell腳本的文件名,如果執行腳本包含了路徑,那麼就包括腳本路徑

$n

獲取當前執行的shell腳本的第n個參數值,n=1..9,當n0時表示腳本的文件名;如果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

利用dirnamebasename命令單獨獲取名稱或路徑

[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 內置變量命令

常用的內置命令:echoevalexecexportreadshift

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

結論:當變量值resulttest沒有定義時,會給變量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變量有值


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章