bash腳本的變量使用詳解
變量的類型包括整數、字符串和數組,但在bash腳本編程中不需要指定類型就可以直接賦值,默認均為字符型,其參與運算會自動進行隱式類型轉換。
變量的賦值方式為:name='value',其中“=”兩邊一定不能有空格,如果變量值中包含有空格則需要使用引號引起來,需要注意的是強引用和弱引用的區分。此外變量的賦值也可以引用變量和命令,如果引用變量賦值需要使用雙引號,如果引用命令賦值需要使用反向單引號。變量的引用需要使用"$"符號,如引用變量PATH:$PATH 或 ${PATH}。
示例1:
[root@fengl /]# a=hello #給變量a賦值hello [root@fengl /]# b="hello world" #給變量b賦值hello world [root@fengl /]# c="$a world" #給變量c賦值并引用變量a的值,需要使用雙引號 [root@fengl /]# echo $c hello world [root@fengl /]# c='$a world' #引用變量a的值給變量c賦值時,如果使用單引號則表示強引用 [root@fengl /]# echo $c $a world [root@fengl /]# d="hello `hostname`" #引用命令賦值時需要在命令上使用反向單引號 [root@fengl /]# echo $d hello fengl [root@fengl /]# d="hello $(hostname)" #引用命令賦值時也可以使用“$()”的方式 [root@fengl /]# echo $d hello fengl [root@fengl /]# d='hello `hostname`' #引用命令賦值時如果使用單引號則會將其當成字符串處理 [root@fengl /]# echo $d hello `hostname`
bash腳本編程的變量根據生效范圍的不同可以分為多種,以下將對每種變量做詳細介紹。
1、局部變量(本地變量)
局部變量也叫本地變量,局部變量的生效范圍僅限當前shell進程,對當前shell之外的其他進程以及當前shell的子進程均無效,即局部變量只能在進程內自己使用,不能被別的進程使用,包括子進程。
示例2:
#查看已編好的測試腳本,該腳本中定義了局部變量testvar [root@fengl bin]# cat test.sh #!/bin/bash #author:liang #Version:1.0 #Test script testvar="hello world" echo "This is my first script,the testvar value is $testvar" #直接執行test.sh腳本可以正常調用腳本中的變量 [root@fengl bin]# test.sh This is my first script,the testvar value is hello world #使用echo命令調用test.sh腳本中的變量testvar,發現無法輸出變量結果,即局部變量在當前shell的其他進程中無效 [root@fengl bin]# echo "testvar value is $testvar" testvar value is #再編輯一個腳本test1.sh,在該腳本中重新定義一個變量testvar2,并調用這個變量testvar2和test.sh腳本中的變量testvar, #同時也對test.sh腳本進行修改,在test.sh腳本中執行test1.sh,實現變量testvar在子進程中被調用,并觀察結果 [root@fengl bin]# cat test1.sh #查看test1.sh腳本 #!/bin/bash testvar2="hello chain" echo "testvar:$testvar" echo "testvar2:$testvar2" [root@fengl bin]# cat test.sh #查看test.sh腳本 #!/bin/bash #author:liang #Version:1.0 #Test script testvar="hello world" echo "This is my first script,the testvar value is $testvar" test1.sh [root@fengl bin]# test.sh #執行test.sh腳本,并觀察結果 This is my first script,the testvar value is hello world testvar: #發現test.sh的子進程test1.sh無法調用test.sh中的變量 testvar2:hello chain [root@fengl bin]# test1.sh #執行test1.sh腳本,并觀察結果 testvar: #發現test.sh中的變量無法被其他進程調用 testvar2:hello chain
2、環境變量
環境變量與局部變量的最大的區別是環境變量可以在當前shell的其他進程中被調用,也可以在當前shell的子進程中被調用,但在其他shell中無法被調用,系統中常用的變量大多數都是環境變量,并且系統中的環境變量全部為大寫字母,如PATH、LANG、SHELL等。環境變量的定義方式也與本地變量不同,環境變量定義時需要聲明該變量是環境變量,聲明方式為:
export name=VALUE 或 declare -x name=VALUE
查看環境變量的命令也有多個,分別為:
export 或 env 或 printenv
3、只讀變量
只讀變量也叫常量,一旦聲明了只讀變量后,則該變量無法修改和刪除,常用于固定的值,如圓周率π。只讀變量和局部變量類似,只讀變量也只能在自己的進程中使用,不能被當前shell的其他進程調用,包括子進程。只讀變量和局部變量在退出當前的進程時將被自動刪除。
聲明只讀變量的方式為:
readonly name 或 declare -r name
一個變量既可以同時被申明為只讀變量和環境變量,聲明方式為 declare -r -x name
4、位置變量
位置變量是系統中定義好的一種特殊變量,其作用是在腳本代碼中調用通過命令行傳遞給腳本的參數,比如當執行某個腳本時可以跟上幾個參數,通過調用位置變量來給腳本傳遞參數。位置變量的應用方式如下:
(1)使用位置變量直接調用命令行中的參數,使用方式為$直接跟數字,表示命令行中對應的參數,如$1表示命令行中的第1個參數,$2表示命令行中的第2個參數。這里需要強調的是$0表示調用命令本身
[root@fengl bin]# cat test #查看一個寫好并調用了位置變量的腳本 cat: test: No such file or directory [root@fengl bin]# cat test.sh #!/bin/bash #author:liang #Version:1.0 #Test script echo "輸入的第1個參數為:$1" echo "輸入的第2個參數為:$2" echo "輸入的命令為:$0" [root@fengl bin]# test.sh aaaa bbbb #執行腳本時跟上兩個參數 輸入的第1個參數為:aaaa 輸入的第2個參數為:bbbb 輸入的命令為:/root/bin/test.sh
(2)使用位置變量傳遞命令行中的所有參數,使用方式為$*或$@,雖然這兩種方式都能將命令行中的所有參數傳遞過來,但是$*和$@傳遞的參數是由區別的,$*傳遞的參數為一個整合過的字符創,而$@傳遞的參數為一個多個獨立的字符串,需要注意的是$*和$@只是在引號引起來的時候才存在差異
[root@fengl bin]# cat test.sh #查看編輯好并條用位置變量的腳本 #!/bin/bash #author:liang #Version:1.0 #Test script echo -e "使用\$*傳遞的參數為:$*" echo -e "使用\$@傳遞的參數為:$@" echo -e "用\$*的值在./aa下創建目錄" mkdir ./aa/"$*" echo ====================================== echo -e "用\$@的值在./bb下創建目錄" mkdir ./bb/"$@" [root@fengl bin]# bash -x test.sh x y #執行腳本并顯示腳本執行過程 + echo -e '使用$*傳遞的參數為:x y' 使用$*傳遞的參數為:x y + echo -e '使用$@傳遞的參數為:x' y 使用$@傳遞的參數為:x y + echo -e '用$*的值在./aa下創建目錄' 用$*的值在./aa下創建目錄 + mkdir './aa/x y' #從這可以看出使用$*創建的是一個“x y”的目錄,并且該目錄在./aa目錄下 + echo ====================================== ====================================== + echo -e '用$@的值在./bb下創建目錄' 用$@的值在./bb下創建目錄 + mkdir ./bb/x y #從這可以看出使用$@創建的是兩個目錄,分別為./bb下的x目錄和./下的y目錄 [root@fengl bin]# ll aa/ #查看使用$*創建的目錄 total 4 drwxr-xr-x. 2 root root 4096 Aug 15 02:53 x y [root@fengl bin]# ll bb/ ./ #查看使用$@創建的目錄 ./: total 80 ... drwxr-xr-x. 2 root root 4096 Aug 15 02:53 y bb/: total 4 drwxr-xr-x. 2 root root 4096 Aug 15 02:53 x
(3)使用位置變量傳遞參數個數,用法為$#
[root@fengl bin]# cat test1.sh #查看編輯好并調用位置變量的腳本 #!/bin/bash echo "使用的參數個數為:$#" [root@fengl bin]# test1.sh a b c #執行腳本,并跟上參數 使用的參數個數為:3
原創文章,作者:苦澀咖啡,如若轉載,請注明出處:http://www.www58058.com/33916
理論與實踐結合,注意下次聯系跟總結寫在一起哦。