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