以下內容轉載自http://183530300.blog.51cto.com/894387/1841659
相信正在腳本之路上狂奔的同學們,都能感覺到腳本中需要應用變量的地方非常廣泛,簡單來看變量也只不過就是:var=value;如果我們深入其 中,也能發現變量裏面的學問其實也挺深的,今天就給大家分享一下這個小小的變量裏面到底有多少的學問吧。Shell變量一般是無類型的,但是bash Shell提供了declare和typeset兩個命令用於指定變量的類型,兩個命令是完全等價的。
一、高級變量用法——定義有類型變量
declare [選項] 變量名
-r 將變量設置爲只讀屬性 等同於使用export VAR_NAME
-i 將變量定義爲整型數
-a 將變量定義爲數組
-f 顯示此腳本前定義過的所有函數名及其內容
-F 僅顯示此腳本前定義過的所有函數名
-x 將變量聲明爲環境變量
-l 將變量值轉爲小寫字母
-u 將變量值轉爲大寫字母
二、字符串切片:
1、${#var}:返回字符串變量var的長度
示例代碼:
[root@centos7 array]# vara=test12345
[root@centos7 array]# echo ${vara}
test12345
[root@centos7 array]# echo ${#vara}
9
2、${var:offset}:返回字符串變量var中從第offset個字符後(不包括第offset個字符)的字符開始,到最後的部分,offset的取值在0 到 ${#var}-1 之間
(bash4.2後,充許爲負值)
示例代碼:
[root@centos7 array]# vara=test12345
[root@centos7 array]# echo ${vara:4}
12345
3、${var:offset:number}:返回字符串變量var中從第offset個字符後(不包括第offset個字符)的字符開始,長度爲number的部分
示例代碼:
[root@centos7 array]# vara=test12345
[root@centos7 array]# echo ${vara:3:4}
t123
4、${var: -lengh}:取字符串的最右側幾個字符
注意:冒號後必須有一空白字符
示例代碼:
[root@centos7 array]# vara=test12345
[root@centos7 array]# echo ${vara: -3}
345
[root@centos7 array]# echo ${vara: -5}
12345
三、字符串處理
(一)基於模式取子串:
1、${var#*word}:自左而右,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串開頭至第一次出現word字符之間的所有字符
示例代碼:
[root@centos7 array]# vara=test12345
[root@centos7 array]# echo ${vara#*12}
345
[root@centos7 array]# echo ${vara#*es}
t12345
2、${var##*word}:同上,不同的是,刪除的是字符串開頭至最後一次由word指定的字符之間的所有內容
示例代碼:
[root@centos7 array]# file=/var/log/messages
[root@centos7 array]# echo ${file##*/}
messages
3、${var%word*}:自右而左,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串最後一個字符向左至第一次出現word字符之間的所有字符
示例代碼:
[root@centos7 array]# file=/var/log/messages
[root@centos7 array]# echo ${file%/*}
/var/log
4、${var%%word*}:同上,只不過刪除字符串最右側的字符向左至最後一次出現word字符之間的所有字符
示例代碼:
[root@centos7 array]# url=http://www.baidu.com:80
[root@centos7 array]# echo ${url##*:}
80
[root@centos7 array]# echo ${url%%:*}
http
(二)查找替換:
1、${var/pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substi替換之
示例代碼:
[root@centos7 array]# vara=test12345test
[root@centos7 array]# echo ${vara/es/00}
t00t12345test
2、${var//pattern/substi}: 查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substi替換之
示例代碼:
[root@centos7 array]# vara=test12345test
[root@centos7 array]# echo ${vara/es/00}
t00t12345test
[root@centos7 array]# echo ${vara//es/00}
t00t12345t00t
3、${var/#pattern/substi}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substi替換之
示例代碼:
[root@centos7 array]# vara=test12345test
[root@centos7 array]# echo ${vara/#te/00}
00st12345test
4、${var/%pattern/substi}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substi替換之
示例代碼:
[root@centos7 array]# vara=test12345test
[root@centos7 array]# echo ${vara/#te/00}
00st12345test
[root@centos7 array]# echo ${vara/%st/000}
test12345te000
(三)查找並刪除:
1、${var/pattern}:查找var所表示的字符串中,刪除第一次被pattern所匹配到的字符串
示例代碼:
[root@centos7 array]# vara=test12345test
[root@centos7 array]# echo ${vara/12345}
testtest
2、${var//pattern}:查找var所表示的字符串中,刪除所有被pattern所匹配到的字符串
示例代碼:
[root@centos7 array]# vara=test12345test
[root@centos7 array]# echo ${vara//t}
es12345es
[root@centos7 array]# file=/var/log/messages
[root@centos7 array]# echo ${file///}
varlogmessages
3、${var/#pattern}:查找var所表示的字符串中,刪除行首被pattern所匹配到的字符串
示例代碼:
[root@centos7 array]# vara=test12345test
[root@centos7 array]# echo ${vara/#test}
12345test
[root@centos7 array]# file=/var/log/messages
[root@centos7 array]# echo ${file/#\/var}
/log/messages
4、${var/%pattern}:查找var所表示的字符串中,刪除行尾被pattern所匹配到的字符串
示例代碼:
[root@centos7 array]# file=/var/log/messages
[root@centos7 array]# echo ${file/%ges}
/var/log/messa
[root@centos7 array]# vara=test12345test
[root@centos7 array]# echo ${vara/%test}
test12345
(四)字符大小寫轉換:
1、${var^^}:把var中的所有小寫字母轉換爲大寫
示例代碼:
[root@centos7 array]# vara=test
[root@centos7 array]# echo ${vara^^}
TEST
2、${var,,}:把var中的所有大寫字母轉換爲小寫
示例代碼:
[root@centos7 array]# vara=WANGJUN
[root@centos7 array]# echo ${vara,,}
wangjun
四、變量賦值高級方式
1、${var:-value}:如果var爲空或未設置,那麼返回value;否則,則返回var的值
示例代碼:
[root@centos7 array]# echo ${varb:-100}
100
2、${var:+value}:如果var不空,則返回value
示例代碼:
[root@centos7 array]# varb=wangjun
[root@centos7 array]# echo ${varb:+100}
100
3、${var:=value}:如果var爲空或未設置,那麼返回value,並將value賦值給var;否則,則返回var的值
示例代碼:
[root@centos7 array]# varb=wangjun
[root@centos7 array]# echo ${varb:=100}
wangjun
[root@centos7 array]# echo ${varc:=100}
100
4、${var:?error_info}:如果var爲空或未設置,那麼返回error_info;否則,則返回var的值
示例代碼:
[root@centos7 array]# varb=wangjun
[root@centos7 array]# echo ${varb:?4}
wangjun
[root@centos7 array]# echo ${vard:?4}
-bash: vard: 4
使用配置文件爲腳本程序變量賦值
(1) 定義文本文件,每行定義“name=value”
(2) 在腳本中source此文件即可
五、間接變量引用
如果第一個變量的值是第二個變量的名字,從第一個變量引用第二個變量的值就稱爲間接變量引用
var1=var2
var2=value
var1的值是var2,而var2又是變量名,var2的值爲value,間接變量引用是指通過var1獲得變量值value的行爲
bash Shell提供了兩種格式實現間接變量引用
eval var3=\$$var1
var3=${!var1}
示例代碼:
[root@centos7 useradmin]# var1=user
[root@centos7 useradmin]# user=test
[root@centos7 useradmin]# echo $var1
user
[root@centos7 useradmin]# eval var3=\$$var1
[root@centos7 useradmin]# echo $var3
test
[root@centos7 useradmin]# var4=${!var1}
[root@centos7 useradmin]# echo $var4
test
eval命令
eval命令將會首先掃描命令行進行所有的置換,然後再執行該命令。該命令適用於那些一次掃描無法實現其功能的變量。該命令對變量進行兩次掃描
示例代碼:
[root@centos7 useradmin]# prefix=user
[root@centos7 useradmin]# $num
bash: 005: command not found...
[root@centos7 useradmin]# num=005
[root@centos7 useradmin]# eval "echo $prefix{001..$num}"
user001 user002 user003 user004 user005