bash脚本编程之一 变量、变量类型等
變量的內(nèi)容
1、變量命名:
? ? ? ? ? ?1、只能包含字母、數(shù)字和下劃線(xiàn),并且不能以數(shù)字開(kāi)頭,
????2、不應(yīng)該跟系統(tǒng)中已有的環(huán)境變量重名
????3、最好能見(jiàn)名知意
?
2、變量賦值:
設(shè)置變量:
變量名稱(chēng)=值
fld_name=value?等號(hào)兩邊不能有空格
注意:用echo 顯示變量名的值時(shí),需要用$符號(hào)。?
?
?
針對(duì)數(shù)字,你可以可以這樣為變量賦值,定義一個(gè)變量的類(lèi)型:?
?
3、變量類(lèi)型:
環(huán)境變量:
????本地變量(局部變量):
????位置變量:
????特殊變量(系統(tǒng)變量):
本地變量:作用域?yàn)檎麄€(gè)bash進(jìn)程
????varname=value
局部變量:作用域只對(duì)當(dāng)前代碼段有效
????local?varname=value
環(huán)境變量:作用域?yàn)楫?dāng)前shell進(jìn)程及其子進(jìn)程
????export?varname=value?"導(dǎo)出“
任意腳本在執(zhí)行時(shí)會(huì)啟動(dòng)一個(gè)子shell進(jìn)程,
????????命令行中啟動(dòng)的腳本會(huì)繼承當(dāng)前shell的環(huán)境變量
????????系統(tǒng)自動(dòng)執(zhí)行的腳本(跟命令行無(wú)關(guān))就需要自我定義需要的各環(huán)境變量
位置變量:
????$1,$2,....
????????$??上一個(gè)命令執(zhí)行狀態(tài)返回值
????????$#?參數(shù)的個(gè)數(shù)
????????$*?參數(shù)列表
????????$@?參數(shù)列表
????????$0??命令本身??腳本本身
????執(zhí)行腳本時(shí)的腳本路徑及名稱(chēng)
程序執(zhí)行一般有兩類(lèi)返回值??????程序執(zhí)行結(jié)果;
????執(zhí)行狀態(tài)返回代碼(0-255)
????????????0表示正確
????????????1-255:錯(cuò)誤執(zhí)行?1,2,127?系統(tǒng)預(yù)留?有特殊意義
?
4、變量取消:
unset ? varname
撤銷(xiāo)fld_name域的值?
?查看當(dāng)前shell中的變量
?set??不帶任何參數(shù)和選項(xiàng)
?
?
如果查看當(dāng)前shell中的環(huán)境變量????????env
????????export
????????printenv
字符串變量添加新的變量
?PATH添加新的路徑
export?PATH=$PATH:/usr/local/apsch/bin
?
?
?
?
?
5、取得變量值:
$變量名稱(chēng)${變量名稱(chēng)}??$(x)?這個(gè)可以用來(lái)當(dāng)做命令調(diào)用
如果變量在語(yǔ)句當(dāng)中被引用,必須要使用${x}才可以,取得數(shù)組的變量值時(shí)候也需要使用${}來(lái)調(diào)用
?
?關(guān)于變量和引號(hào)的關(guān)系:
????單引號(hào):所見(jiàn)即所得????雙引號(hào):使特殊符號(hào)生效
?
?
?
6、調(diào)整變量的屬性:
1、readonly?命令?:定義只讀變量
????????-p:顯示目前具有只讀屬性的變量列表
????????-f:設(shè)定函數(shù)不可修改
????????-a:定義數(shù)組不可修改
?count環(huán)境變量readonly之前可以修改,之后變成只讀變量,不可以在修改。
?
?readonly ?-p 讀取只讀變量,顯示在終端。
?
?
?2、declare?命令?
????????-r:設(shè)定只讀變量????????-p:顯示變量的屬性
????????-a:變量是一個(gè)數(shù)組
????????-f:搜尋命令時(shí),只找函數(shù)
????????-i:變量是一個(gè)整數(shù)
????????-F:顯示所有的函數(shù)式名稱(chēng)及其屬性
????????-t:設(shè)立變量具有trace屬性
????????-x:設(shè)定環(huán)境變量
?
7、數(shù)組:??
?
?是一種數(shù)據(jù)結(jié)構(gòu),有相關(guān)的數(shù)據(jù)項(xiàng)組成,每個(gè)數(shù)據(jù)項(xiàng),稱(chēng)為數(shù)組的元素,且可采用索引的方式取得個(gè)元素的值
數(shù)組賦值:
1、單個(gè)賦值,以index作為索引號(hào),索引號(hào)從0開(kāi)始
# 為數(shù)組賦值
?
?#顯示數(shù)組中所有值方法一
$echo ?${a[*]}?
?
?
?#顯示數(shù)組中所有值方法二
$echo ?${a[@]}?
?
?
#為數(shù)組添加數(shù)據(jù)項(xiàng)?
?
2、使用小括號(hào)為數(shù)組賦值
?
? ? a=(1000 2000 3000)?默認(rèn)空格隔開(kāi)
?#為數(shù)組b賦值? 記住是小括號(hào),不是大括號(hào)
?
?
#打印出第一個(gè)和第4個(gè)數(shù)據(jù)項(xiàng)?
?
?
3、為數(shù)組中的某一個(gè)數(shù)據(jù)項(xiàng)賦值,默認(rèn)是從0開(kāi)始,如果中間出現(xiàn)未比標(biāo)示的索引項(xiàng),則從前一個(gè)索引項(xiàng)開(kāi)始計(jì)算
?
? ? a={51?[3]=5??cto??[6]=8}
#為數(shù)組賦值 ?#打印出數(shù)組中所有值 ??
?
?
#驗(yàn)證中間出現(xiàn)的數(shù)值是從哪個(gè)索引項(xiàng)開(kāi)始算起的?
?數(shù)組d[7]測(cè)試:
?
?
?顯示賦值:
????echo?${a[1]}取出數(shù)組中所有的值:
????echo?${a[@]}??或者echo?${a[*]}
取得數(shù)組元素的個(gè)數(shù):
????echo?${#a[@]}?或者?echo?${#a[*]}
?
?數(shù)組元素及個(gè)數(shù):
?
?
?
?8.高級(jí)變量
${變量名稱(chēng)}??變量擴(kuò)展
$(命令)??????命令替換
$((算術(shù)式))??算術(shù)擴(kuò)展
?
?
$(命令)?命令替換:
?測(cè)試變量存在與否:
????${countor:-'num'}?判斷條件,如果countor存在,就返回值,如果countor不存在,就把-后接的字符串當(dāng)做整個(gè)變量擴(kuò)展的結(jié)果,并傳回
?
?
?測(cè)試變量不存在或?yàn)榭?#xff0c;傳回一個(gè)默認(rèn)值
?${myname:-'nick'}?如果待測(cè)變量不存在或?yàn)榭?#xff0c;傳回-后的值,存在則傳回變量的值
賦值給變量chen:?
?
?
測(cè)試變量不存在或?yàn)榭?#xff0c;給變量設(shè)定一個(gè)默認(rèn)值
????${count:=100}?若變量coutn沒(méi)有值或?yàn)榭?#xff0c;則把待測(cè)變量設(shè)定為默認(rèn)值,
測(cè)試變量不存在或?yàn)榭?#xff0c;傳回錯(cuò)誤信息
????${myname:?"your?input?error"}
?
?
?
測(cè)試變量的存在性:
????${myname:+Ture}?若變量存在且值非空,則符合判斷
?
? ? ?:??空??????????????測(cè)空置
????-???負(fù)向 ? ? ? ? ? ? ? ? 測(cè)不存在
????+???正向 ? ? ? ? ? ? ? ? 測(cè)存在
???????有問(wèn)題????????????檢查是否完備后再來(lái)執(zhí)行吧
????=???設(shè)值 ? ? ? ? ? ? ? ? 給控值變量設(shè)定一個(gè)默認(rèn)值
?
$(命令)?命令替換??此命令等同于··?(esc下的按鍵,不是單引號(hào))這個(gè)在編寫(xiě)腳本的時(shí)候很有用?
?
$((算術(shù)式))算術(shù)擴(kuò)展:
?
?
?
?----借鑒:
字符串切片是從0開(kāi)始的?在使用${}的時(shí)候?大括號(hào)內(nèi)的變量引用前面的$可以不寫(xiě)
????????${變量:位置起點(diǎn)}???${myname:3}
????????${變量:位置起點(diǎn):長(zhǎng)度}
| 12345678 | #定義變量[root@lovelace 51cto]# myname=lovelace#取得變量字符串從第三個(gè)字符開(kāi)始到字符串結(jié)尾的所有字符[root@lovelace 51cto]# echo ${myname:3}elace#取得變量字符串中從第四個(gè)字符開(kāi)始,長(zhǎng)度為2的字符[root@lovelace 51cto]# echo ${myname:4:2}la |
????
取部分參數(shù):
????????命令行參數(shù)是從$1開(kāi)始的依次類(lèi)推,$@代表所有參數(shù),命令本身使用$0來(lái)表示
????????${@:起點(diǎn)}:由點(diǎn)開(kāi)始,取得后面的所有的位置參數(shù)
????????${@:起點(diǎn):個(gè)數(shù)}:由起點(diǎn)開(kāi)始,取得指定個(gè)數(shù)的位置參數(shù)
示例腳本
| 12345678910 | #!/bin/bash#Verson:0.1#Auther:lovelace#Pragram:test argument#取得程序名echo?$0#取得變量的所有值echo?${@:1}#取得變量的個(gè)數(shù)echo?$# |
?
執(zhí)行結(jié)果:
| 1234 | [root@lovelace 51cto]# ./argument.sh 12 32 45./argument.sh12 32 453 |
?
計(jì)算字符串長(zhǎng)度:
????${#變量名稱(chēng)}:傳回變量值的字符串長(zhǎng)度
????expr:也可以統(tǒng)計(jì)字符串的長(zhǎng)度
????????1、str="here?you?are."
???????????len$(expr?length?"$str")
???????????echo?"str?字符串長(zhǎng)度是:$len"
????????2、expr?"字符串“:‘。*’
????????????str="here?you?are."
????????????len=$(expr?"$str":'.*')
????????????echo?"str字符串長(zhǎng)度是:$len"
| 12345678910111213 | [root@lovelace 51cto]# echo $mynamelovelace#使用${#變量名}取得字符串長(zhǎng)度? 比較常用[root@lovelace 51cto]# echo ${#myname}8#使用${expr length “$變量名”}取得字符串長(zhǎng)度[root@lovelace 51cto]# len=$(expr length "$myname")[root@lovelace 51cto]# echo $len8#使用${expr “$變量名” : '.*'}取得字符串長(zhǎng)度[root@lovelace 51cto]# len=$(expr "$myname" : '.*')[root@lovelace 51cto]# echo $len8 |
?
變量擴(kuò)展:對(duì)比樣式
????由字符串前面對(duì)比,刪除最短的
?????????${變量#樣式}
????由字符串前面對(duì)比,刪除最長(zhǎng)的
?????????${變量##樣式}
| 1234567891011 | #定義一個(gè)變量[root@lovelace 51cto]# path=$(pwd)#查看變量值[root@lovelace 51cto]# echo $path/home/scripts/51cto#使用對(duì)比樣式[root@lovelace 51cto]# echo ${path#*/}home/scripts/51cto#此對(duì)比樣式可以取得目錄名[root@lovelace 51cto]# echo ${path##/*/}51cto |
????由字符串后面對(duì)比,刪除最短的
?????????${變量%樣式}
????由字符串后面對(duì)比,刪除最長(zhǎng)的
??????????${變量%%樣式}
| 12345 | #使用此對(duì)比樣式可以取得路徑名[root@lovelace 51cto]# echo ${path%/*}/home/scripts#使用此對(duì)比樣式?jīng)]有任何數(shù)據(jù)輸出[root@lovelace 51cto]# echo ${path%%/*} |
?
至于對(duì)比樣式可以根據(jù)自己的思考來(lái)獲得,這個(gè)沒(méi)有固定的格式
?
取代或刪除部分字符串:
????只替換第一個(gè)對(duì)比符合的字符串
????????${變量/樣式/替換字符串}
????替換所有符合的字符串
????????${變量//樣式/替換字符串}
| 123456789 | #定義一個(gè)變量[root@lovelace 51cto]# echo $mynamelovelace#替換第一次出現(xiàn)的l為F[root@lovelace 51cto]# echo ${myname/l/F}Fovelace#替換字符串中所有l(wèi)為F[root@lovelace 51cto]# echo ${myname//l/F}FoveFace |
?
刪除對(duì)比符合的字符串
????只刪一個(gè)
????????${變量/樣式/}
????刪除全部
????????${變量//樣式/}
????#T??行首位置
????%LE??最后面
???
| 123456789 | #定義一個(gè)變量獲取IP地址相關(guān)的信息[root@lovelace 51cto]# tmp=$(ifconfig eth0 | grep 'inet addr')#刪除對(duì)比樣式成功的字符串 然后賦值給變量r[root@lovelace 51cto]# r=${tmp/inet addr:/}#刪除對(duì)比樣式成功的字符串 然后賦值給變量ip[root@lovelace 51cto]# ip=${r/ Bcast*/}#打印出變量ip 查看是不是我們想要的結(jié)果[root@lovelace 51cto]# echo $ip192.168.2.54 |
變量擴(kuò)展:取變量名稱(chēng)列表、數(shù)組索引列表
取變量名稱(chēng)列表:
????????${!開(kāi)頭字符串@}或${!開(kāi)頭字符串*}
| 12345 | [root@lovelace 51cto]# myname=lovelace;mytest=51cto[root@lovelace 51cto]# echo ${!my@}myname mytest[root@lovelace 51cto]# echo ${!my*}myname mytest |
取數(shù)組索引列表:
????????${!數(shù)組變量[@]}或${!數(shù)組變量[*]}
| 123456 | #取得數(shù)組a的所有值[root@lovelace 51cto]# echo ${a[@]}hello 2 3 nick#取得數(shù)組a的索引項(xiàng)[root@lovelace 51cto]# echo ${!a[@]}0 1 2 3 |
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/client-server/p/5519935.html
總結(jié)
以上是生活随笔為你收集整理的bash脚本编程之一 变量、变量类型等的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Couchbase应用示例(初探)
- 下一篇: 样式操作