Linux Shell之三 進階變數及字串

來源:互聯網
上載者:User

標籤:linux   shell   變數   字串   進階變數   

進階變數包含三個部分
1、變數擴充
2、命令替換
3、算術擴充

在Bash Shell中,$算符會觸發到上述三種擴充,基本形式如下:
    基本型             擴充種類            例子            
${變數名稱}            變數擴充        ${filename}
$(命令)                命令替換        $(ls /)
$((算術式))            算術擴充        $((5+3))

變數存在表示變數有值(包含空)
一、 變數擴充:測試存在性及空值
測試變數“存在與否”的基本用法
${待測變數-預設值}
如果待測變數有定義(包括為空白),則傳回待測變數預設值,如果無定義,則傳回-後的預設值。
a=yang                     a=
b=${a-‘hello‘}
echo $b
因為變數a有存在,所以$b值為yang,如果a存在,但為空白,那麼$b值為空白。如果a不存在,$b為hello
變數分為兩種狀態,1 存在(包括為空白) 2 不存在
${待測變數:-預設值}
如果待測變數存在,則傳回待測變數預設值,如果不存在或為空白,則傳回:-後的預設值。
a=yang                     a=
b=${a:-‘hello‘}
echo $b
因為變數a存在,所以$b值為yang,如果a為空白或不存在,$b的值就為:-後的hello
總結:
如果變數擴充條件式只有-  則只做變數存在性的判斷。
                  使用:- 則除了做變數是否存在,還會判斷變數是否為空白
一句話:多了個“:”,就要同時測試存在性及空值兩種情況。

[ -n ${A:-} ] && set -v
[]是測試條件的文法,-n測試其後接的變數為空白,若非空,傳回真值(長度不為0為真,-z長度為0為真)。
${待測變數:=預設值}
如果待測變數不存在或為空白,就把待測變數值設為:=後的預設值。若存在,則設為待測變數值。
a=yang                    
b=${a:=‘hello‘}
echo $b
因為變數a存在,所以$b值為yang,如果a為空白或不存在,$b的值就為:=後的hello
b=${a:-‘hello‘}和b=${a:=‘hello‘}看上去好像是一樣的,但是:-是當變數a為空白或者不存在的時候,其後的值hello為變數b的值,a依舊是空或不存在。:=是當變數a為空白或不存在的時候,其後的值hello為變數b的值,並且預設為變數a的值(相當於給a賦了一個值)。
${待測變數:?提示資訊}
若變數不存在或為空白值,則顯示變數名稱和:?後的提示資訊,並立即停止執行指令碼。
目的:確保變數值一定存在,否則不執行指令碼。
#!/bin/bash
fn=${1:?‘錯誤,請提供要刪除目錄的名稱‘}                      對傳入的第一個參數做檢查,若未空,顯示提示資訊,並停止指令碼。
echo ‘你要刪除的目錄指令是:‘
echo "rm -rf ~/$fn"
測試變數的"存在性"
{待測變數:+真值}
若變數存在,且不為空白,則傳回“真值”,否則傳回空值。
a=123
b=${a:+‘true‘}
echo $b
因為a存在,且值非空,所以$b為true,如果a不存在或a為空白,那麼$b值為空白。
小結:
    :        空          測空值
    -        負向        測不存在
    =        設值        給空值變數設一個預設值
    ?        有問題      檢查條件是否完備再來執行吧
    +        正向        測試存在

二、變數擴充:取字串切片、字串長度
    字串的第一個字元,編號為0,右鄰的字元編號,依次增加1.接下來介紹如如何字串的某一部分以及如何取得字串長度
取字串切片
${變數:位置起點}            位置起點等同於下邊的編號。
a="hello,world"
b=${a:3}
echo $b
由第4個字元開始,到結束。$b值為lo,world
 ${變數:位置起點:長度}
a="hello,world"
b=${a:3:5}
echo $b
由第4個字元開始,共5個字元。$b的值為lo,wo
取部分位置參數
${@:n} n為正整數,為位置起點到最後
!/bin/bash
echo $0
echo ${@:2}  除了命令本身,從第2個字元(命令本身為0,編號為3)到最後
./script.sh 12 23 34 45 傳回值為23 34 45
${@:n:m} n、m為正整數,n是起始字元,m是長度
!/bin/bash
echo $0
echo ${@:2:4}      長度為4
./script.sh 12 23 34 45 56 67 78 傳回值為23 34 45 56
計算字串長度
${#變數名稱}    傳回變數值的字串長度
[[email protected] ~]# cat 1.sh
#!/bin/bash
#
A=‘/etc/passwd‘
echo ${#A}
[[email protected] ~]# bash 1.sh
11
[[email protected] ~]#
${#數組[@]}        取得數組元素個數
${#數組[*]}        取得數組元素個數

三、變數擴充:對比樣式
這裡說的"對比樣式",目的是想截取變數值(字串)的某一部分。做法是將符合樣式的部分字串刪除或取代。
由字串前面對比,刪除相符者
由前邊(最左開始),對比變數值,刪除最短相符合的字串。
${變數#樣式}
a="/usr/sbin/ntpdate"
b=${a#/*/}
echo $b
/*/代表,凡一對/之間有字串者,對比符合,那$b值為sbin/ntpdate
由前邊(最左開始),對比變數值,刪除最長相符合的字串。
${變數##樣式}
a="/usr/sbin/ntpdate"
b=${a##/*/}
echo $b
/*/代表,凡一對/之間有字串者,對比符合,那$b值為ntpdate
由字串後面對比,刪除相符者
由後邊(最右開始),對比變數值,刪除最短相符合的字串。
${變數%樣式}

a="/usr/sbin/ntpdate"
b=${a%/*}
echo $b
/*代表,凡一對/之間有字串者,對比符合,那$b值為/usr/sbin
由後邊(最右開始),對比變數值,刪除最長相符合的字串。
${變數%%樣式}

a="/usr/sbin/ntpdate"                                 a="www.baidu.com"
b=${a%%/*}                                            b=${a%%.*}
echo $b                                               echo $b  此時 $b為www
/*代表,凡一對/之間有字串者,對比符合,那$b值為空白
小結:
文法                用途
${變數#樣式}        由前邊對比、刪最短的
${變數##樣式}       由前邊對比、刪最長的
${變數%樣式}        由後邊對比、刪最短的
${變數%%樣式}       由後邊對比、刪最長的

取代或刪除部分字串
只替換第一個對比符號的字串(如果刪除,替換字元處為空白)
${變數/樣式/替換字串}

a="root:x:0:0:root:/root:/bin/bash"
b=${a/:/,}
echo $b
$b值為root,x:0:0:root:/root:/bin/bash
替換所有對比符合的字串(如果刪除,替換字元處為空白)
${變數//樣式/替換字串}    
            
a="root:x:0:0:root:/root:/bin/bash"
b=${a//:/,}
echo $b
$b值為root,x,0,0,root,/root,/bin/bash
b=${a/#s /} 刪除以s開頭的行以空格結尾
b=${a/%s /} 刪除以s結尾的行
四、變數擴充:取變數名稱列表、數組索引列表
取變數名稱列表
${!開頭字串@} 或${!開頭字串*}    
echo ${[email protected]} 或${!x*}         以x開頭的變數名稱。

a1=11
a2=dfds
b=sfs
echo ${[email protected]}  值為a1、a2
取數組索引列表
${!陣列變數[@]} 或${!陣列變數[*]}
[[email protected] ~]# cat 1.sh
#!/bin/bash
#
a=(one two three four five)
for i in "${!a[@]}"
do
   echo "第$i個字串為${a[$i]}"
done
[[email protected] ~]# bash 1.sh
第0個字串為one
第1個字串為two
第2個字串為three
第3個字串為four
第4個字串為five
[[email protected] ~]#
五、命令替換
這裡的命令替換指的是把命令執行後的標準輸出放入變數中,有兩種寫法:
新式寫法:變數名稱=$(命令)
舊式寫法:變數名稱=`命令`

舊式寫法的引號為反引號,一般位於Tab鍵上方。
[[email protected] ~]# ls /home/
lost+found  nagios  xguest
[[email protected] ~]# cat 1.sh
#!/bin/bash
#
a=$(ls /home)
for f in $a
do
 echo $f
done
[[email protected] ~]# bash 1.sh
lost+found
nagios
xguest
[[email protected] ~]#
IFS是指定分隔字元,預設是空白或Tab
六、算術擴充
如果a=8+4 b=$a echo $b 輸出結果肯定為8+4 ,因為bash shell 把任何儲存在變數中的值,皆視為以字元組成的字串。
算術擴充的文法:$((算術式))
a=3+4
b=$a
echo $b
輸出則為7
七、單引號、雙引號、反引號的區別
單引號字串的限制:
1、單引號裡的任何字元都會原樣輸出,單引號字串中的變數是無效的;
2、單引號字串中不能出現單引號(對單引號使用轉義符後也不行)。

雙引號的優點
1、雙引號裡可以有變數
2、雙引號裡可以出現逸出字元

反引號
反引號括起來的東西是一個執行的命令
date是一個可以查看日期的命令
PWD是內部變數,echo $PWD顯示當前路徑
我們看一下使用不同的符號會有什麼效果
1、貨幣符號$在單、雙引號的表現,單引號中的$將保留它的字面意思,雙引號中的$將發生變數引用
[[email protected] ~]# echo ‘$PWD‘
$PWD
[[email protected] ~]# echo "$PWD"
/root
2、反斜線\在單、雙引號中的表現,單引號中\將保留它的字面意思,雙引號中的\轉義後邊的字元(失去特殊意義)
[[email protected] ~]# echo ‘\$PWD‘
\$PWD
[[email protected] ~]# echo "\$PWD"
$PWD
3、反引號與其它兩種符號不同,反引號包圍起來的字串將被運行,取其結果。
[[email protected] ~]# echo ‘date‘
date
[[email protected] ~]# echo "date"
date
[[email protected] ~]# echo `date`
Fri May 1 12:39:21 CST 2015
注:反引號中的date被當成命令執行,包含的正是命令從輸出資訊。
總結:
當需要一個字串的時候,使用單引號;
當內部包含變數的時候,使用雙引號;
當鋪捉命令輸出的時候,用反引號;


本文出自 “Welcome To Linux World” 部落格,請務必保留此出處http://linuxnote.blog.51cto.com/9876511/1641172

Linux Shell之三 進階變數及字串

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.