linux中變量使用
文章目錄
一、簡介
linux shell是動態(運行期才確定數據類型)弱類型(操作不同類型數據時不需要強制轉換)語言,其變量不區分數據類型,都是字符串,具體依賴於上下文。
二、變量定義
2.1 變量定義
變量定義直接使用=賦值,使用關鍵字unset刪除變量,變量引用使用{variable},簡寫爲$variable。
#定義變量
varZero="study"
echo ${varZero} #輸出study
#刪除變量
unset varZero
echo ${varZero} #沒有輸出
2.2 變量類型
變量類型有三種:用戶變量、位置變量、環境變量。
2.2.1 用戶變量
用戶變量就是shell編程中自定義的變量,分爲全局變量和局部變量,默認爲全局變量。可使用local關鍵字指定變量爲局部變量。示例如下:
#定義函數funOne,函數內分別定義全局變量和局部變量
function funOne(){
#默認全局變量
varOne="this is a global variable"
#默認全局變量
local varTwo="this is a local variable"
}
#調用函數funOne
funOne
#輸出全局變量,輸出有值
echo ${varOne}
#輸出局部變量,輸出沒有值
echo ${varTwo}
2.2.2 位置變量
位置變量(也稱位置參數)是在shell腳本或函數中傳參時,通過數字引用的變量,0到9可以直接引用,如$1、{10}。
對於位置參數,還有特殊表示$#、?、@、$$,含義如下:
- $#:表示變量個數;
- $0:表示命令名字;
- $?:表示上條命令的結束值;
- $*:表示所有參數;
- $@:表示所有參數,且被雙引號包含;
- $$:表示當前shell進程id,如果是腳本,表示腳本所在進程id;
示例如下:
function funTwo(){
#輸出傳入參數個數
echo $# #結果爲2
#輸出所有參數
echo $* #one two
#輸出所有參數,且被雙引號包含
echo $@ #one two
#輸出當前shell進程id,如果是腳本,表示腳本所在進程id
echo $$ #38217
#輸出上條命令結束值
echo $? #0
#輸出命令名字
echo $0 #/xxx/variable_study.sh
#通過位置輸出傳入的參數
echo $1 $2 #one two
}
#向函數傳遞參數
funTwo one two
2.2.3 環境變量
進程運行都有自己的上下文環境,而環境則由一系列變量構成,這些變量即是環境變量。環境變量是全局變量,需要用export關鍵字修飾。環境變量作用範圍:
- 對於啓動的shell進程,環境變量作用範圍在當前進程及其生成的子進程有效;
- 對於shell腳本,直接命令行調用時,環境變量只對腳本中的命令及其產生的子進程有效,但使用source執行腳本時,export環境變量在父進程中也有效;
同時要注意環境變量的有效期爲到進程消亡爲止。可以將環境變量定義在系統啓動文件中,達到永久生效目的。常用啓動文件有:
- /etc/profile:系統級別有效;
- /etc/bashrc:特定bash有效;
- $HOME/.bash_profile:用戶定義的環境,指定用戶範圍有效;
- $HOME/.bashrc:用戶定義的bash初始化文件,指定用戶範圍有效;
常用環境變量有:
- PATH:搜索路徑;
- HOME:用戶home目錄路徑;
- LOGNAME:用戶登錄名;
- SHELL:shell路徑;
三、變量使用
3.1 變量取值
在大括號中,可以對變量取值進行替換操作,常用的有:
- ${variable:-word}:當變量variable存在且非null時,則返回variable,否則返回word值;
- ${variable:=word}:當變量variable存在且非null時,則返回variable,否則將variable賦值爲word並返回;
- ${variable:?message}:當變量variable存在且非null時,則返回variable,否則打印message並退出腳本;
- ${variable:+word}:當變量variable存在且非null時,則返回word,否則返回null;
示例如下:
#此時變量varThree仍爲null
echo ${varThree:-defaultVal} #defaultVal
#此時變量varThree值爲defaultVal
echo ${varThree:=defaultVal} #defaultVal
#變量varFour不存在,故沒有輸出
echo ${varFour:+"exist"}
#打印undefine並退出當前腳本
echo ${varFour:?"undefine"} #varThree: undefine
3.2 變量模式操作
在大括號中,還可以進行模式匹配操作,常用操作有:
- ${variable#pattern}:刪除變量variable開頭最短匹配pattern,返回剩餘數據;
- ${variable##pattern}:刪除變量variable開頭最長匹配pattern,返回剩餘數據;
- ${variable%pattern}:刪除變量variable結尾最短匹配pattern,返回剩餘數據;
- ${variable%%pattern}:刪除變量variable結尾最長匹配pattern,返回剩餘數據;
- ${variable/pattern/word}:替換變量variable中第一個的最長匹配pattern爲word並返回,注意,此時模式pattern可以使用#匹配開頭,%匹配結尾;
- ${variable//pattern/word}:替換變量variable中所有的最長匹配pattern爲word並返回;
varFive="http://dragon.com/study.txt"
#刪除變量開頭最短匹配,返回剩餘數據
echo ${varFive#*/} #/dragon.com/study.txt
#刪除變量開頭最長匹配,返回剩餘數據
echo ${varFive##*/} #study.txt
#刪除變量結尾最短匹配,返回剩餘數據
echo ${varFive%/*} #http://dragon.com
#刪除變量結尾最長匹配,返回剩餘數據
echo ${varFive%%/*} #http:
#替換變量variable中第一個的最長匹配pattern爲word並返回
echo ${varFive/t/T} #hTtp://dragon.com/study.txt
#模式中藉助#,替換變量variable中開頭的最長匹配pattern爲word並返回
echo ${varFive/#h/T} #Tttp://dragon.com/study.txt
#模式中藉助%,替換變量variable中結尾的最長匹配pattern爲word並返回
echo ${varFive/%t/T} #http://dragon.com/study.txT
#替換變量variable中所有的最長匹配pattern爲word並返回
echo ${varFive//t/T} #hTTp://dragon.com/sTudy.TxT
3.3 變量長度
使用${#variable}獲取變量長度,示例如下:
varSix="abcde"
#輸出變量varSix長度
echo ${#varSix} #5
3.4 變量截取
使用${variable:offset:length}進行變量截取,示例如下:
varSeven="abcdefg"
#從索引爲2(第3個字符,包含)的字符開始輸出
echo ${varSeven:2} #cdefg
#輸出最後2個字符
echo ${varSeven:(-2)} #fg
#輸出索引爲2(第3個字符,包含)起的後3個字符
echo ${varSeven:2:3} #cde