linux中變量使用

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、292,超過9則需要用大括號括起來,如{10}。
對於位置參數,還有特殊表示$#、00、?、*、@、$$,含義如下:

  • $#:表示變量個數;
  • $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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章