相信正在腳本之路上狂奔的同窗們,都能感受到腳本中須要應用變量的地方很是普遍,簡單來看變量也只不過就是:var=value;若是咱們深刻其中,也能發現變量裏面的學問其實也挺深的,今天就給你們分享一下這個小小的變量裏面到底有多少的學問吧。Shell變量通常是無類型的,可是bash Shell提供了declare和typeset兩個命令用於指定變量的類型,兩個命令是徹底等價的。centos
1、高級變量用法——定義有類型變量
declare [選項] 變量名
-r 將變量設置爲只讀屬性 等同於使用export VAR_NAME
-i 將變量定義爲整型數
-a 將變量定義爲數組
-f 顯示此腳本前定義過的全部函數名及其內容
-F 僅顯示此腳本前定義過的全部函數名
-x 將變量聲明爲環境變量
-l 將變量值轉爲小寫字母
-u 將變量值轉爲大寫字母數組
2、字符串切片:
一、${#var}:返回字符串變量var的長度
示例代碼:
[root@centos7 array]# vara=test12345
[root@centos7 array]# echo ${vara}
test12345
[root@centos7 array]# echo ${#vara}
9bash
二、${var:offset}:返回字符串變量var中從第offset個字符後(不包括第offset個字符)的字符開始,到最後的部分,offset的取值在0 到 ${#var}-1 之間
(bash4.2後,充許爲負值)
示例代碼:
[root@centos7 array]# vara=test12345
[root@centos7 array]# echo ${vara:4}
12345ide
三、${var:offset:number}:返回字符串變量var中從第offset個字符後(不包括第offset個字符)的字符開始,長度爲number的部分
示例代碼:
[root@centos7 array]# vara=test12345
[root@centos7 array]# echo ${vara:3:4}
t123函數
四、${var: -lengh}:取字符串的最右側幾個字符
注意:冒號後必須有一空白字符
示例代碼:
[root@centos7 array]# vara=test12345
[root@centos7 array]# echo ${vara: -3}
345
[root@centos7 array]# echo ${vara: -5}
12345學習
3、字符串處理
(一)基於模式取子串:
一、${var#*word}:自左而右,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串開頭至第一次出現word字符之間的全部字符
示例代碼:
[root@centos7 array]# vara=test12345
[root@centos7 array]# echo ${vara#*12}
345
[root@centos7 array]# echo ${vara#*es}
t12345url
二、${var##*word}:同上,不一樣的是,刪除的是字符串開頭至最後一次由word指定的字符之間的全部內容
示例代碼:
[root@centos7 array]# file=/var/log/messages
[root@centos7 array]# echo ${file##*/}
messagescentos7
三、${var%word*}:自右而左,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串最後一個字符向左至第一次出現word字符之間的全部字符
示例代碼:
[root@centos7 array]# file=/var/log/messages
[root@centos7 array]# echo ${file%/*}
/var/logspa
四、${var%%word*}:同上,只不過刪除字符串最右側的字符向左至最後一次出現word字符之間的全部字符
示例代碼:
[root@centos7 array]# url=http://www.baidu.com:80
[root@centos7 array]# echo ${url##*:}
80
[root@centos7 array]# echo ${url%%:*}
http命令行
(二)查找替換:
一、${var/pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substi替換之
示例代碼:
[root@centos7 array]# vara=test12345test
[root@centos7 array]# echo ${vara/es/00}
t00t12345test
二、${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
三、${var/#pattern/substi}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substi替換之
示例代碼:
[root@centos7 array]# vara=test12345test
[root@centos7 array]# echo ${vara/#te/00}
00st12345test
四、${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
(三)查找並刪除:
一、${var/pattern}:查找var所表示的字符串中,刪除第一次被pattern所匹配到的字符串
示例代碼:
[root@centos7 array]# vara=test12345test
[root@centos7 array]# echo ${vara/12345}
testtest
二、${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
三、${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
四、${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
(四)字符大小寫轉換:
一、${var^^}:把var中的全部小寫字母轉換爲大寫
示例代碼:
[root@centos7 array]# vara=test
[root@centos7 array]# echo ${vara^^}
TEST
二、${var,,}:把var中的全部大寫字母轉換爲小寫
示例代碼:
[root@centos7 array]# vara=WANGJUN
[root@centos7 array]# echo ${vara,,}
wangjun
4、變量賦值高級方式
一、${var:-value}:若是var爲空或未設置,那麼返回value;不然,則返回var的值
示例代碼:
[root@centos7 array]# echo ${varb:-100}
100
二、${var:+value}:若是var不空,則返回value
示例代碼:
[root@centos7 array]# varb=wangjun
[root@centos7 array]# echo ${varb:+100}
100
三、${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
四、${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此文件便可
5、間接變量引用
若是第一個變量的值是第二個變量的名字,從第一個變量引用第二個變量的值就稱爲間接變量引用
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
正在學習腳本的同窗們,當你看到這兒的同時,有什麼想法嗎,相信曾經的困惑被打開了吧,至少當初我本身學到這兒的時候,豁然開朗。