shell腳本變量處理和擴(kuò)展

shell腳本變量處理和擴(kuò)展

變量的類型

局部變量

局部變量只在代碼塊或一個(gè)函數(shù)里有效

如果變量用local來聲明,那么它只能在該變量聲明的代碼塊(block of code)中可見。這個(gè)代碼塊就是局部"范圍"。 在一個(gè)函數(shù)內(nèi),局部變量意味著只能在函數(shù)代碼塊內(nèi)它才有意義。

例如如下代碼:

#!/bin/bash

para1='a'

function func(){
 local para2='b'
 echo "para1:${para1}"
 echo "para2:${para2}"
}

func
echo "para1:${para1}"
echo "para2:${para2}"

輸出為:

para1:a
para2:b
para1:a
para2:

變量的聲明

declare或typeset內(nèi)建命令(它們是完全相同的)可以用來限定變量的屬性.這是在某些編程語言中使用的定義類型不嚴(yán)格的方式。命令declare是bash版本2之后才有的。命令typeset也可以在ksh腳本中運(yùn)行。

-r只讀

declare -r var等同于readonly var

-i整數(shù)

將變量認(rèn)為是整數(shù)

例如:

n=6/3
echo $n

declare -i n
n=6/3
echo $n

輸出為:

6/3
2

-a數(shù)組

-f函數(shù)

在腳本中沒有帶任何參數(shù)的declare -f 會列出所有在此腳本前面已定義的函數(shù)出來。而declare -f function_name則只會列出指定的函數(shù)。

例如:

function abcd(){
  echo abcd
}
function cdef(){
  echo cdef
}
declare -f
echo
declare -f abcd

輸出為:

abcd ()
{
    echo aaa
}
cdef ()
{
    echo cdef
}

abcd ()
{
    echo aaa
}

-F函數(shù)

顯示所有的自定義函數(shù)的名稱

例如上述例子:

declare -F

輸出為:

declare -f abcd
declare -f cdef

-x export

這樣將聲明一個(gè)變量作為腳本的環(huán)境變量而被導(dǎo)出。

類似的用法有:

declare -x var
typeset -x var
export var

-p 變量

類似-f選項(xiàng)。不傳參數(shù)會顯示所有的變量的值。傳參數(shù)只會顯示對應(yīng)的變量的值。

常用變量使用方法

${parameter}

運(yùn)行如下腳本:

#!/bin/bash

para='a'
echo ${para}

運(yùn)行結(jié)果為:

a

其中para是腳本的變量。也可以簡寫為$para的形式,但是在某種情況下可能會引起歧義。

在一個(gè)雙引號(" ")里的變量引用不會禁止變量替換。所以雙引號被稱為部分引用,有時(shí)也稱為"弱引用"。而在一個(gè)單引號里(' ')的變量替換是被禁止的,變量名只被解釋為普通的字面意思。所以單引號被稱為"全局引用",有時(shí)也被稱為強(qiáng)引用。

未初始化的變量又一個(gè)空的值(null)但是在算術(shù)運(yùn)算中會按照0來計(jì)算。

Bash不以"類型"來區(qū)分變量。本質(zhì)上來說,Bash變量是字符串,但是根據(jù)環(huán)境的不同,Bash允許變量有整數(shù)計(jì)算和比較。其中的決定因素是變量的值是不是只含有數(shù)字。

${parameter-default}, ${parameter:-default}

如果變量沒有被設(shè)置,使用默認(rèn)值。它們之間的差別是:當(dāng)一個(gè)參數(shù)已被聲明,但是值是NULL的時(shí)候兩者不同。

例如:

#!/bin/bash

echo a:${a-'a'}
echo a:${a}
a=
echo a:${a-'a'}
echo a:${a}

echo b:${b:-'b'}
echo b:$
b=
echo b:${b:-'b'}
echo b:$
a:a
a:
a:
a:
b:b
b:
b:b
b:

${parameter=default}, ${parameter:=default}

如果變量parameter沒有設(shè)置,把它設(shè)置成默認(rèn)值.

兩種形式幾乎相同,只是和上面的一樣,只有當(dāng)$parameter變量被聲明且被設(shè)置成null值時(shí)不同

${parameter+alt_value}, ${parameter:+alt_value}

如果變量parameter設(shè)置,使用alt_value作為新值,否則使用空字符串。

除了引起的當(dāng)變量被聲明且值是空值時(shí)有些不同外,兩種形式幾乎相等。

例如:

#!/bin/bash

echo a:${a+'a'}
a=
echo a:${a+'a'}

echo b:${b:+'b'}
b=
echo b:${b:+'b'}

echo a:${a+'a'}
a=qqqqqqq
echo a:${a+'a'}

echo b:${b:+'b'}
b=qqqqqqq
echo b:${b:+'b'}

運(yùn)行結(jié)果為:

a:
a:a
b:
b:
a:a
a:a
b:
b:b

${parameter?err_msg}, ${parameter:?err_msg}

如果變量parameter已經(jīng)設(shè)置,則使用該值,否則打印err_msg錯(cuò)誤信息。

通??梢杂糜趨?shù)檢查。

: ${qwe?"qwe doesnot exit"}

結(jié)果為:

bash: qwe: qwe doesnot exit

變量的擴(kuò)展

${#var}

字符串的長度

例如:

a='aaa'
echo ${#a}

結(jié)果為:

3

${var#Pattern}, ${var##Pattern}

刪除從$var前端開始的最短或最長匹配$Pattern的字符串。

例如:

a='abcd1234abcd1234abcd1234'
echo ${a#*abcd}
echo ${a##*abcd}

輸出為:

1234abcd1234abcd1234
1234

${var%Pattern}, ${var%%Pattern}

刪除從$var后端開始的最短或最長匹配$Pattern的字符串。

例如:

a='abcd1234abcd1234abcd1234'
echo output:${a%abcd*}
echo output:${a%%abcd*}

輸出為:

output:abcd1234abcd1234
output:

${var:pos}

變量var被展開成從位移pos個(gè)字符往后的值

例如:

a='abcd'
echo ${a:2}

輸出為:

cd

${var:pos:len}

從變量var中展開成從位移pos的字符往后最長為len的字符串。與上一個(gè)命令用法相仿。

${var/Patten/Replacement}

在變量var第一個(gè)匹配Pattern的字符串用Replacement代替

${var//Patten/Replacement}

所有在變量var中被Pattern匹配到的都由Replacement代替。

例如:

a='abcd1234abcd1234abcd'
echo ${a/abcd/1234}
echo ${a//abcd/1234}

輸出為:

12341234abcd1234abcd
12341234123412341234

${var/#Pattern/Replacement}

如果變量var前綴匹配模式Pattern,則用Replacement代替匹配模式的字符串.

${var/%Pattern/Replacement}

如果變量var的后綴匹配模式Pattern,則用Replacement代替匹配模式的字符串.

例如:

a='abcd1234abcd1234abcd'
echo ${a/#ab/1234}
echo ${a/%cd/1234}
echo ${a/#bc/1234}
echo ${a/%bc/1234}

輸出為:

1234cd1234abcd1234abcd
abcd1234abcd1234ab1234
abcd1234abcd1234abcd
abcd1234abcd1234abcd

${!varprefix*}, ${!varprefix@}

匹配所有前面聲明過的變量,并且變量名以varprefix開頭.

例如:

abc1=1
abc2=a
abc3=

echo ${!abc*}
echo ${!abc@}

輸出為:

abc1 abc2 abc3
abc1 abc2 abc3
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容