局部變量
1、普通字符串變量
變量名=value
變量名='value' ?#單引號中不進行變量解析,原樣輸出,應用不多
變量名="value" #雙引號會解析變量
例:
a1=123
a2='234'
a3="345"
echo "a1=$a1"
echo "a2=$a2"
echo "a3=${a3}" ?#${a3}和$a3等同
在AWK中,單雙引號的作用相反
local i ?#在一個函數中聲明一個局部變量
把命令作為變量
CMD=`ls`
CMD=$(ls)
echo $CMD ?#此時就會執行命令
用法:用命令作為變量進行打包 tar zcf $(uname -n).tar.gz /etc/services
H=$(uname -n)
tar zcf ${H}.tar.gz /etc/services ?#加{}的目的是為了確定變量名
Shell的特殊變量
$0 ?獲取當前腳本的文件名
$n ?獲取第n個腳本參數,如果大于9,則用${n}
$# ?腳本參數的個數
dirname $0 ?#取其路徑
basename $0 #取其文件名
2、進程狀態變量
$? ?獲取上一個指令的返回值,0為成功,非零失敗
2表示權限拒絕
1~125表示腳本命令、系統命令錯誤或參數傳遞錯誤
126找到該命令但無法執行
127沒有改命令
$$ ?獲取當前Shell的進程號(PID)
利用$?在程序當中做判斷:
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/portmap
$* 將所有命令行所有參數視為一個整體字符串,等同于"$1$2$3"
$@ ?將命令行每個參數視為單獨的字符串,等同于"$1" ?"$2" ?"$3",這是將參數傳遞給其他程序的最佳方式,因為他會保留所有內嵌在每個參數里的任何空白。
編輯test.sh,內容如下
for i in $*; do echo $i; done; echo "----"
for i in $@; do echo $i; done; echo "----"
for i; do echo $i; done; echo "----"
for i in "$*"; do echo $i; done; echo "----"
for i in "$@"; do echo $i; done; echo "----"
執行命令bash test.sh "one two" three four
輸出結果:
one
two
three
four
----
one
two
three
four
----
one two
three
four
----
one two three four
----
one two
three
four
----
3、bash內部變量
Shell本身提供的常用命令:echo ?eval ?exec ?export ?readonly ?read ?shift ?wait ?exit ?點(.)
echo ?將變量名指定的變量顯示到標準輸出
shift ?改變命令行參數的位置,即$2稱為$1,$3成為$2,...,以此類推。并且$#減1
export ?變量名=value ?聲明環境變量