本篇開始,介紹shell腳本編程,更確切的說是bash腳本編程(版本:4.2.46(1)-release)。咱們從變量開始。shell
和全部的編程語言同樣,bash也提供變量,變量是一些用來指代數據並支持數據操做的名稱。編程
概念vim
當咱們經過ssh等工具登陸系統時,便得到一個shell(一個bash進程),bash在啓動過程當中會加載一系列的配置文件,這些配置文件的做用就是爲用戶準備好bash環境,大部分環境變量
都是在這些文件中被設置的。segmentfault
登陸shell
(login shell)是指須要經過輸入用戶名、密碼登陸以後得到的shell(或者經過選項"--login
"生成的shell)。登陸shell的進程名爲-bash
,非登陸shell(好比在桌面環境下經過打開一個"終端
"窗口程序而得到的shell)的進程名爲bash
。centos
[root@centos7 ~]# ps -ef|grep [b]ash root 2917 2915 0 14:25 pts/3 00:00:00 -bash root 2955 2953 0 14:25 pts/5 00:00:00 -bash root 3070 3068 0 14:42 pts/4 00:00:00 -bash
交互式shell
(interactive shell)是指shell與用戶進行交互,shell須要等待用戶的輸入(鍵入一條命令後並按下回車鍵),用戶須要等待命令的執行和輸出。當把一到多個命令寫入一個文件,並經過執行這個文件來執行這些命令時,bash也會爲這些命令初始化一個shell環境,這樣的shell稱爲非交互式shell
。
環境變量-
中存儲了當前shell的選項標誌,其中若是包含字符i
則表示此shell是交互式shell:數組
#輸出變量'-'的值 [root@centos7 ~]# echo $- himBH [root@centos7 ~]#
一般,一個登陸shell
(包括交互式登陸shell和使用"--login"選項的非交互shell)首先讀取並執行文件/etc/profile
(此文件會在結尾處判斷並執行/etc/profile.d/
中全部以.sh結尾的文件);而後按順序搜索用戶家目錄下的~/.bash_profile
、~/.bash_login
和~/.profile
,並執行找到的第一個可讀文件(在centos7系統中是文件~/.bash_profile
,此文件會進一步判斷並執行文件~/.bashrc
,而後再進一步判斷並執行文件/etc/bashrc
)。當一個登陸shell登出時(exit
),會執行文件~/.bash_logout
和/etc/bash.bash_logout
(若是文件存在的話)。交互式非登陸shell
啓動時,bash會讀取並執行文件~/.bashrc
。非交互式shell
啓動時(如腳本中),會繼承派生出此shell的父shell的環境變量並執行環境變量BASH_ENV
的值中所指代的文件。bash
做用ssh
環境變量的做用主要是影響shell的行爲,在整個bash進程的生命週期中,會屢次使用到環境變量。每一個由當前bash進程派生出的子進程(包括子shell),都會繼承當前bash的環境變量(除非子進程對繼承的環境變量進行了從新賦值,不然它們的值將和父進程相同)。
下面列出部分經常使用環境變量及其做用:編程語言
PATH
其值是一個以冒號分隔的目錄列表,定義了shell命令的搜索路徑。函數
[root@centos7 ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PS1
首要命令提示符。
#筆者環境下變量PS1的值: [root@centos7 ~]# echo $PS1 [\u@\h \W]\$ # \u 表示當前用戶的用戶名 # \h 表示主機名字符串中直到第一個.以前的字符 # \W 表示當前路徑的basename,用戶家目錄會被縮寫爲波浪號(~) # \$ 若是用戶UID爲0,則爲符號 #,不然爲符號 $
PS2
連續性 交互式提示符。當輸入的命令分爲好幾行時,新行前出現的字符串即爲PS2變量的值。
[root@centos7 ~]# echo $PS2 > [root@centos7 ~]#
PS3
shell腳本中 select 關鍵字提示符PS4
shell調試模式下的提示符HOME
當前用戶的家目錄PWD
當前工做目錄OLDPWD
前一個工做目錄
# cd 命令後若是沒有任何參數時,則使用$HOME做爲默認參數 [root@centos7 tmp]# cd [root@centos7 ~]# # cd 命令後的參數 - 等同於 $OLDPWD [root@centos7 ~]# cd - /root/temp/tmp # cd 命令的成功執行會更新兩個環境變量(PWD和OLDPWD)的值 [root@centos7 tmp]# echo $PWD $OLDPWD /root/temp/tmp /root [root@centos7 tmp]#
RANDOM
每次引用此變量,都會生成一個0到32767之間的隨機數字BASH_VERSION
其值爲當前bash版本號
[root@centos7 tmp]# echo $BASH_VERSION 4.2.46(1)-release [root@centos7 tmp]#
IFS
域分隔符,用來分隔單詞。默認值爲 空格鍵 TAB鍵 回車鍵產生的字符
#能夠用set命令查看當前環境下的全部變量 [root@centos7 tmp]# set|grep IFS IFS=$' \t\n' [root@centos7 tmp]#
本系列中在涉及到具體環境變量的時候還有更詳細的解釋和用法描述。
普通變量
bash除了在初始化時自動設置的變量外,用戶還能夠根據須要手動設置變量。
普通變量賦值語句寫法:
name=[value]
其中name
爲變量名,變量名必須以英文字母([a-zA-Z]
)或下劃線(_
)開頭,其他字符能夠是英文字母、下劃線或數字([0-9]
)。變量名是大小寫敏感的。在給變量賦值時,等號兩邊不能有任何空白字符。等號後的值(value
)能夠省略,若是省略,則變量的值爲空字符串(null
)。
數組變量。
bash提供一維的索引和關聯數組變量,索引數組
是以數字爲下標的數組,關聯數組
是以字符串爲下標的數組(相似其餘語言中的map或dict)。
數組賦值語句寫法:
name=(value1 value2 ... valueN)
其中每個value
都是相似以[subscript]=string
的格式,索引數組賦值時能夠省略[subscript]=
,關聯數組不能省略。
#索引數組賦值的通常形式: name_index=(aa bb cc dd ee) #關聯數組賦值以前,必須先經過內置命令declare進行聲明,而後才能賦值: declare -A name_associate name_associate=([aa]=1 [bb]=2 [cc]=3 [dd]=4)
所謂內置命令
,是指由bash自身實現的命令,它們的執行就至關於執行bash的一個函數,並不須要派生出新的子進程。外部命令
是指那些不是由bash自身實現的命令(如環境變量PATH目錄內的命令)。原則上全部命令都應該外部實現(避免臃腫及和其餘系統耦合度太高),可是,外部命令的執行,意味着建立子進程,而子進程對環境變量等的更改是沒法影響父進程的。bash想要更改自身的一些狀態時,就得靠內置命令
來實現。例如,改變工做目錄命令cd
,就是一個典型的例子(cd
命令會更改當前所處目錄,並更新環境變量PWD和OLDPWD,若是此功能由外部實現,更改目錄的目的就沒法實現了)。
bash中還支持一些表示特殊意義的變量,這些變量不能使用上述語句進行賦值。
$0 本程序所處的進程名。 $n n是從1開始的整數,表示當前進程參數,$1表示第一個參數、$2表示第二個參數...$n表示第n個參數。若是n大於10,取值時須要寫成${n}的格式。當執行函數時,這些位置變量被臨時替換爲函數的第一個參數、第二個參數、、、第N個參數。 $* 表示當前進程的全部參數。$1 $2 ... ${n}。當處於雙引號中取值時,全部結果被當成一個總體,即 "$*" 等同於 "$1 $2 ... ${n}"。 $@ 表示當前進程的全部參數。$1 $2 ... ${n}。當處於雙引號中取值時,每一個結果被當成單獨的單詞,即 "$@" 等同於 "$1" "$2" ... "${n}"。 $# 表示當前進程的參數個數。 $? 表示前一個命令的返回碼,爲0表示前一個命令執行成功,非0表示執行失敗。 $- 表示當前shell的選項標誌。 $$ 表示當前shell的PID。 $! 表示最近一次執行的後臺命令的PID。 $_ 在shell初始啓動時表示啓動此shell命令的絕對路徑或腳本名,隨後,表示前一條命令的最後一個參數。
一般bash的變量是不須要提早聲明的,能夠直接進行賦值。變量的值均被視爲字符串
(在一些狀況下也能夠視爲數字)。當對變量有特殊須要時,也能夠先聲明變量(如前面關聯數組的聲明)。
bash提供了幾個和變量聲明及賦值相關的內置命令,這些命令便可以和賦值語句寫在同一行(表示聲明及賦值),也能夠只跟變量名(表示聲明)。
[]
表示可選:
declare [options] name[=value] ... typeset [options] name[=value] ...
這是兩個起一樣做用的命令,用來聲明變量;
#如聲明一個普通變量: declare name[=value] #如聲明一個只能存儲數字的變量: declare -i name[=value] #選項-i表示爲變量增長一個數字屬性,變量name中只能存儲數字,若是將字符串賦給此變量時,變量的值爲0 #如聲明一個索引數組 declare -a name_index[=(aa bb cc dd ee)] #如聲明一個變量,並將其導出爲環境變量 declare -x name[=value] #如聲明一個只讀變量 declare -r name[=value]
以上選項可使用命令declare +OPTION name
撤銷變量name的屬性(只讀變量除外)
內置命令export
做用於賦值語句時,和declare -x
相似表示導出變量爲環境變量(臨時有效,重啓系統後這些環境變量消失;如需設置永久環境變量,須要將export
語句寫入前面所述的bash配置文件中)。
內置命令readonly
做用於賦值語句時,和declare -r
相似表示標記變量爲只讀:
#如普通只讀變量 readonly name[=value] #如只讀索引數組 readonly -a name_index[=(aa bb cc dd ee)] #如只讀關聯數組 readonly -A name_associate[=([aa]=1 [bb]=2 [cc]=3 [dd]=4)] #如標記函數爲只讀 readonly -f function_name
只讀變量不能從新賦值,不能使用內置命令unset
進行撤銷,不能經過命令declare +r name
取消只讀屬性。
內置命令read
做用是從標準輸入讀入一行數據賦值給變量
[root@centos7 ~]# read NAME 1 2 3 #此處鍵入字符串"1 2 3" [root@centos7 ~]# echo $NAME 1 2 3
當有多個變量名時,環境變量IFS
用來將輸入分隔成單詞。當單詞數大於變量數時,剩餘的單詞和分隔符會被賦值給最後一個變量。當單詞數小於變量數時,剩餘的變量被賦空值。
[root@centos7 ~]# read NUM_1 NUM_2 NUM_3 1 2 3 4 5 [root@centos7 ~]# echo $NUM_1 1 [root@centos7 ~]# echo $NUM_2 2 [root@centos7 ~]# echo $NUM_3 3 4 5
選項-a
表示將讀入的數據賦值給索引數組
[root@centos7 ~]# read -a BLOG < file #這裏輸入來自文件,當文件有多行時,第二行及後續行將被忽略。 [root@centos7 ~]# echo ${BLOG[@]} #取數組中全部元素的值 this is vvpale's blog [root@centos7 ~]# echo ${#BLOG[@]} #取數組元素個數 4 [root@centos7 ~]#
選項-p string
表示在等待輸入時顯示提示符字符串string
[root@centos7 ~]# read -p "請輸入變量值:" NUM_4 請輸入變量值:345 [root@centos7 ~]# echo $NUM_4 345 [root@centos7 ~]#
選項-d
表示指定分隔符(原分隔符爲\n)
[root@centos7 ~]# read -d ':' ROOT < /etc/passwd [root@centos7 ~]# echo $ROOT root [root@centos7 ~]#
內置命令readarray
和mapfile
表示從標準輸入中讀入數據並賦值給索引數組,每行賦給一個數組元素:
[root@centos7 ~]# seq 10 > file [root@centos7 ~]# readarray NUM <file [root@centos7 ~]# echo ${NUM[*]} 1 2 3 4 5 6 7 8 9 10 [root@centos7 ~]# echo ${#NUM[*]} 10 [root@centos7 ~]#
變量有一個狀態set/unset
:只要變量被賦過值,就稱變量是set
的狀態(即便變量的值爲空null
);不然,則稱變量是unset
的狀態(即便變量被declare或其餘內置命令聲明過)。
可使用內置命令unset
對變量進行撤銷(特殊變量和只讀變量除外)。
#撤銷普通變量 unset name #撤銷整個數組 unset array_name #撤銷數組中單個值(其實是把相應的值置空,數組元素個數減一) unset array_name[index] #撤銷函數 unset function_name
對變量進行賦值時,可使用操做符+=
表示對值的追加:
#普通變量 [root@centos7 ~]# var=hello [root@centos7 ~]# echo $var hello [root@centos7 ~]# var+=_world [root@centos7 ~]# echo $var hello_world [root@centos7 ~]# unset var [root@centos7 ~]# #數字變量使用+=表示將原有值和新值進行數學運算(加法),注意與字符串變量的區別。 [root@centos7 ~]# declare -i NUM=5 [root@centos7 ~]# echo $NUM 5 [root@centos7 ~]# NUM+=5 [root@centos7 ~]# echo $NUM 10 [root@centos7 ~]# unset NUM [root@centos7 ~]# #數組變量使用+=做用於上述複合賦值語句表示追加元素至數組 [root@centos7 ~]# array=([0]=hello [1]=world) [root@centos7 ~]# echo ${array[@]} hello world [root@centos7 ~]# echo ${#array[@]} 2 [root@centos7 ~]# array+=(i am vvpale) [root@centos7 ~]# echo ${array[@]} hello world i am vvpale [root@centos7 ~]# echo ${#array[@]} 5 [root@centos7 ~]# unset array
bash使用符號$
對變量進行取值,並使用大括號{}
對變量名的起始和結束進行界定,在不引發混淆的狀況下,大括號能夠省略。
在命令的執行過程當中,變量被其值所替換,在替換的過程當中可以對應於各類變換。bash稱對變量進行取值的過程爲變量替換
或變量擴展
。
#若是值中包含空白字符,賦值時須要用引號引發來表示一個總體。變量中實際存儲的是除去引號的部分。 [root@centos7 ~]# var_1="hello world" [root@centos7 ~]# echo $var_1 hello world [root@centos7 ~]# #數組 [root@centos7 ~]# arr=(1000 2000 3000 4000) [root@centos7 ~]# echo ${arr[@]} 1000 2000 3000 4000 [root@centos7 ~]# echo ${arr[*]} 1000 2000 3000 4000 #注意當被雙引號做用時二者的區別(如前述,同特殊變量$@和$*的狀況一致)
在對變量進行取值時,變量名前的符號!
表示對變量的間接引用:
[root@centos7 ~]# var_2=var_1 [root@centos7 ~]# echo ${!var_2} #必須用大括號 hello world [root@centos7 ~]# #以上若是寫成 ${!var*} 或 ${!var@} 則被替換爲全部以var爲前綴的變量名: [root@centos7 ~]# echo ${!var*} var_1 var_2 [root@centos7 ~]# echo ${!var@} var_1 var_2 #開頭的! 若是用在數組變量上則被擴展成數組的全部下標: [root@centos7 ~]# declare -A array=(["MON"]="星期一" ["TUE"]="星期二" ["WEN"]="星期三" ["THU"]="星期四" ["FRI"]="星期五" ["SAT"]="星期六" ["SUN"]="星期日") [root@centos7 ~]# echo ${!array[*]} THU TUE WEN MON FRI SAT SUN
在變量名前使用符號#
表示取長度,普通變量表示變量值的字符數,數組變量表示數組參數的個數
[root@centos7 ~]# echo ${#var_1} 11 [root@centos7 ~]# echo ${#var_2} 5 [root@centos7 ~]# echo ${#array[*]} 7 [root@centos7 ~]#
對於變量parameter
的狀態(set
或unset
)和值是否爲空(null
),bash提供四種方式擴展:
這裏的word
會通過 波浪號擴展(~替換爲用戶家目錄)、變量擴展、命令替換、數學擴展(之後的文章中會對後兩種做詳細描述)
${parameter:-word}
若是變量狀態爲unset或值爲空,返回word
的結果值,不然返回變量的值。
[root@centos7 ~]# echo ${var_3:-${!var_2}} hello world [root@centos7 ~]# var_3=learnning [root@centos7 ~]# echo ${var_3:-${!var_2}} learnning [root@centos7 ~]# echo ${var_4:-~} /root [root@centos7 ~]#
${parameter:=word}
若是變量狀態爲unset或值爲空,word
的結果會賦值給變量,而後返回變量值。特殊變量($n
$$$
$@
$#
等)不能用這種方式進行賦值。
[root@centos7 ~]# echo ${var_4} #變量var_4未被賦值,這裏輸出一個空行 [root@centos7 ~]# echo ${var_4:=${var_3:-${!var_2}}} #注意這裏變量var_3已被賦值learnning,因此沒有輸出"hello world" learnning [root@centos7 ~]# echo ${var_4} learnning [root@centos7 ~]#
${parameter:?word}
若是變量狀態爲unset或值爲空,word
的結果值會被輸出到標準錯誤,若是shell是非交互的(如腳本中)則退出(exit);不然展開爲變量的值。
[root@centos7 ~]# echo ${var_4:?"exist"} learnning [root@centos7 ~]# echo ${var_5:?"not exist"} -bash: var_5: not exist
${parameter:+word}
若是變量狀態爲unset或值爲空,什麼也不返回,不然返回word
的結果值。
[root@centos7 ~]# echo ${var_5:+${#var_2}} #變量var_5未被賦值,這裏輸出一個空行 [root@centos7 ~]# echo ${var_4:+${#var_2}} 5 [root@centos7 ~]#
以上四種判斷變量的方式中,若是省略了冒號:
,則表示只判斷unset
的狀況。
[root@centos7 ~]# echo ${var_5-"unset"} unset [root@centos7 ~]# var_5= [root@centos7 ~]# echo ${var_5+"set"} set [root@centos7 ~]#
bash支持使用${parameter:offset:length}
的格式對變量取部分值,其中offset
和length
都是數學表達式,分別表明位置
和長度
。parameter
爲普通變量時,表示從第offset個字符(首字符是第0個)開始,取length個字符,若是:length
省略,表示從第offset個字符開始,取到變量值的結尾。
[root@centos7 ~]# echo $var_1 hello world [root@centos7 ~]# echo ${var_1:6} world [root@centos7 ~]# echo ${var_1:1-1:2+3} hello [root@centos7 ~]#
若是offset
的結果小於0,則表示從後往前取子串。
[root@centos7 ~]# echo ${var_1: -5} #注意這裏爲了不和判斷變量狀態的寫法混淆,冒號和減號之間須要有空白字符或者用括號將負數括起來 world [root@centos7 ~]# echo ${var_1: -5:2} wo [root@centos7 ~]#
若是length
的結果小於0,則它表示距離最後一個字符往前length
個字符的位置,和offset
位置一塊兒做用,變量替換的結果就是兩個位置
之間的值。
[root@centos7 ~]# echo ${var_1:2:-2} llo wor [root@centos7 ~]#
parameter
是@
或使用@
或*
做爲下標的數組時,則offset
和length
計算的是元素個數而不是字符數,而且length
的結果不能爲負。
[root@centos7 ~]# ARRAY=("星期一" "星期二" "星期三" "星期四" "星期五" "星期六" "星期日") [root@centos7 ~]# echo ${ARRAY[@]:2:3} 星期三 星期四 星期五 [root@centos7 ~]# echo ${ARRAY[@]:(-3)} 星期五 星期六 星期日 #還要注意$@是從$1開始的參數列表和關聯數組取結果時的不肯定性 [root@centos7 ~]# cat test.sh #將要執行的命令寫入腳本 echo $@ echo ${@:0} echo ${@:2:2} [root@centos7 ~]# [root@centos7 ~]# ./test.sh 1 2 3 4 5 6 7 8 9 #直接執行腳本,參數列表將賦值給特殊變量@ 1 2 3 4 5 6 7 8 9 ./test.sh 1 2 3 4 5 6 7 8 9 #當offset爲0時(對應腳本第二條命令),$0會被添加至參數列表前。 2 3 [root@centos7 ~]# echo ${array[@]} #關聯數組輸出時,結果和賦值時的元素順序不必定相同 星期四 星期二 星期三 星期一 星期五 星期六 星期日 [root@centos7 ~]# echo ${array[@]:2:2} 星期二 星期三 [root@centos7 ~]#
bash提供兩種方式分別刪除變量值的前綴或後綴:${parameter#word}
和${parameter##word}
表示刪除前綴。word
擴展後的結果會做爲模式匹配(通配符匹配,見這裏)變量的值,一個#
表示刪除最短匹配前綴,##
表示刪除最長匹配前綴:
[root@centos7 ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@centos7 ~]# echo ${PATH#*:} /usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@centos7 ~]# echo ${PATH##*:} /root/bin
${parameter%word}
和${parameter%%word}
表示刪除後綴。
[root@centos7 tmp]# path=$PWD #賦值語句中等號右邊部分也會通過 波浪號擴展、變量擴展、命令替換和數學擴展 [root@centos7 tmp]# echo $path /root/temp/tmp [root@centos7 tmp]# echo ${path%/*} #相似於執行命令dirname $path /root/temp #一樣適用於特殊變量和環境變量 [root@centos7 tmp]# vim /etc/yum.repos.d/CentOS-Base.repo [root@centos7 tmp]# cd ${_%/*} [root@centos7 yum.repos.d]# pwd /etc/yum.repos.d [root@centos7 yum.repos.d]# cd - /root/temp/tmp [root@centos7 tmp]# echo $BASH_VERSION 4.2.46(1)-release [root@centos7 tmp]# echo ${BASH_VERSION%%[()]*} #注意這裏的通配符匹配 4.2.46 [root@centos7 tmp]#
若是parameter
是@
或*
或以@
或*
做爲下標的數組變量,刪除操做將做用於每一個位置變量或數組的每一個參數
[root@centos7 ~]# echo ${array[@]} 星期四 星期二 星期三 星期一 星期五 星期六 星期日 [root@centos7 ~]# echo ${array[@]#??} 四 二 三 一 五 六 日
${parameter/pattern/string}
的形式表示用pattern
對變量parameter
進行匹配(通配符匹配),並使用string
的結果值替換匹配(最長匹配)的部分。
[root@centos7 ~]# string=1234567890abcdefghijklmnopqrstuvwxyz [root@centos7 ~]# echo ${string/1234567890/----} ----abcdefghijklmnopqrstuvwxyz [root@centos7 ~]# echo ${string/[0-9]/----} ----234567890abcdefghijklmnopqrstuvwxyz [root@centos7 ~]# echo ${string/a*/....} 1234567890....
若是pattern
以字符/
開頭,則全部被匹配的結果都被替換
[root@centos7 ~]# echo ${string//[0-9]/-} ----------abcdefghijklmnopqrstuvwxyz
若是pattern
以字符#
開頭,匹配的前綴被替換
[root@centos7 ~]# echo ${string/#*0/---} ---abcdefghijklmnopqrstuvwxyz
若是pattern
以字符%
開頭,匹配的後綴被替換
[root@centos7 ~]# echo ${string/%a*/...} 1234567890...
使用@
和*
的狀況和前述同樣,替換將做用於每一個參數
[root@centos7 ~]# A=(100 101 102 103 104) B=.txt P= #多個賦值語句能夠寫在一行 [root@centos7 ~]# echo ${A[@]} 100 101 102 103 104 [root@centos7 ~]# echo $B .txt [root@centos7 ~]# echo -n $P #無輸出 [root@centos7 ~]# echo ${A[*]/%$P/$B} 100.txt 101.txt 102.txt 103.txt 104.txt
${parameter^pattern}
、${parameter^^pattern}
、${parameter,pattern}
、${parameter,,pattern}
大小寫字母轉換,若是parameter
值的首字母匹配模式pattern
(通配符匹配,只能是一個字符,能夠是?
*
[...]
或一個英文字母,多個字符不起做用。pattern省略則表示使用?
),則^
將首字母轉換成大寫,^^
將全部匹配字母轉換成大寫;,
將首字母轉換成小寫,,,
將全部匹配字母轉換成小寫。
[root@centos7 ~]# var_5='hello WORLD' var_6='HELLO world' [root@centos7 ~]# echo ${var_5^[a-z]} Hello WORLD [root@centos7 ~]# echo ${var_5^^*} HELLO WORLD [root@centos7 ~]# echo ${var_5^^} HELLO WORLD [root@centos7 ~]# echo ${var_6,} hELLO world [root@centos7 ~]# echo ${var_6,,[A-Z]} hello world [root@centos7 ~]#
使用@
和*
的狀況和前述相同,大小寫轉換將做用於每一個參數
因爲bash變量賦值的隨意性,自定義變量起名時不要和原有變量(尤爲是環境變量)相沖突,撤銷時也要注意不要將環境變量撤銷掉(雖然撤銷自定義變量並非必須的)。
[root@centos7 ~]# unset ${!var*} ${!NUM@} ARRAY ${!arr*} ROOT BLOG NAME path string word A B P
bash變量的做用域分爲多種:
一、寫入到bash配置文件並用export
導出的環境變量。影響每一個啓動時加載相應配置文件的bash進程及其子進程。
二、當前shell中自定義並經過內置命令export
導出的環境變量。影響當前bash進程及其子進程。
三、當前shell中自定義但未導出的變量。影響當前bash進程及其子進程(不包括須要從新初始化shell的進程)。
四、當前shell中某個函數中經過內置命令local
自定義的局部變量。隻影響此函數及嵌套調用的函數和命令。
五、當前shell中某個命令中的臨時變量。隻影響此命令。
bash變量做用域涉及到子shell和函數的用法,這裏暫時不做舉例說明,後續文章中會詳細敘述。