shell筆記之變數
阿新 • • 發佈:2018-10-31
什麼是變數
變數即在程式執行過程中它的值是允許改變的量
變數的型別
全域性變數(環境變數)
系統預設定義好的,大寫字母組成,哪裡都可以使用
自定義全域性變數方法注意
變數名大寫 定義變數時需要使用export命令 01.export I=1 02.I=1;export I 03.declare -x I=1 檢視系統變數 --env $HOME 使用者登入時進入的目錄 $UID 當前使用者的UID(使用者標識)相當於id-u $PWD 當前工作目錄的絕對路徑名 $SHELL 當前shell $USER 當前使用者 取消變數 --unset 永久生效 --/etc/profile
區域性變數(自定義變數)
在當前指令碼中使用的變數(函式呼叫,指令碼本身)
自定義區域性變數方法注意
01.將命令資訊定義成變數
date_info=`date +%F`($(date +%F))
PS:比較長的命令(多個管道)不建議!
02.將字串資訊定義成變數
字串作為變數名使用時:字母、下劃線開頭
字串作為變數值使用時:字母、數字、下劃線
字串作為變數名使用時,需要配合引號使用:
雙引號:可以解析變數值資訊
單引號:所見即所得
反引號:可以解析命令(ls)
不加:相當於加雙引號
定義變數時命名規範
變數名稱有意義;駝峰語法(每個單詞首字母大寫)。
呼叫變數資訊
1. echo $變數名稱
2. 利用let定義變數運算資訊
[[email protected]_ser]# oldboy=12
[[email protected]_ser]# let oldgirl=$oldboy+1
[[email protected]_ser]# echo $oldgirl
13
3. 利用declare定義變數運算???
[[email protected]_ser]# declare -i oldboy=$oldgirl+1
[[email protected] _ser]# echo $oldboy
14
特殊變數
$0 呼叫指令碼名
[[email protected]_ser ]# cat test01.sh
echo $0
[[email protected]_ser ]# sh test01.sh
test01.sh
企業應用
echo "Usage: $0 {1|2}"
$n 定義指令碼傳參的引數資訊(每個引數之間空格分割、引號匯聚)
PS:當傳參個數大於9時,新增{} --${10}
企業應用(case)
$# 獲得傳參的個數資訊
[[email protected]_ser ]# cat test01.sh
if [ $# -ne 2 ];
then
echo "Usage: $0 {1|2}"
exit 1
else
echo $1 $2
fi
[[email protected]_ser]# sh test01.sh
Usage: test01.sh {1|2}
[[email protected]_ser]# sh test01.sh 1 2
1 2
$* [email protected]
$* 顯示傳參的引數資訊,整體方式進行獲取
[email protected] 顯示傳參的引數資訊,個體方式進行獲取
測試
[[email protected]_ser]# set -- "i am" cool boy
[[email protected]_ser]# echo $#
3
[[email protected]_ser]# echo $1
i am
[[email protected]_ser]# echo $2
cool
[[email protected]_ser]# echo $3
boy
[[email protected]_ser]# for n in "$*";do echo $n;done
i am cool boy
[[email protected]_ser]# for n in "[email protected]";do echo $n;done
i am
cool
boy
特殊變數(程序狀態)
$? --顯示返回值資訊(0表示上一個命令執行成功,非0為失敗)
$$ --記錄指令碼執行時程序號資訊
$! --記錄上一個指令碼的PID
$_ --在此之前執行的命令或指令碼的後一個引數
[[email protected]_ser]# sh test02.sh 1 2 3 4
1 2 3 4
[[email protected]_ser]# echo $_
4
變數擴充套件
變數子串
${parameter:offset} --- $parameter中, 從offset位置之後進行取值, 一直到結尾
[[email protected] scripts]# oldboy="abc123ABC123abc"
[[email protected] scripts]# echo ${oldboy:1}
bc123ABC123abc
[[email protected] scripts]# echo ${oldboy:3}
123ABC123abc
${string:position:length} ---在$string中,從位置$position之後開始提取長度為$length的子串
[[email protected] scripts]# oldboy="abc123ABC123abc"
[[email protected] scripts]# echo ${oldboy:3:3}
123
${parameter#word} ---從字串開始進行匹配word字串資訊, 刪除最短匹配的子串word資訊
${parameter##word} ---從字串開始進行匹配word字串資訊, 刪除最長匹配的子串word資訊
[[email protected] scripts]# oldboy="abcefgabcefg"
[[email protected] scripts]# echo ${oldboy#a*c}
efgabcefg
[[email protected] scripts]# echo ${oldboy##a*c}
efg
${parameter%word} ---從字串結尾進行匹配word字串資訊, 刪除最短匹配的子串word資訊
[[email protected] scripts]# echo ${oldboy%efg}
abcefgabc
[[email protected] scripts]# echo ${oldboy%%efg}
abcefgabc
${parameter/string/replace} --- 替換變數中字串內容, 使用replace字串替換第一個匹配的string字串資訊
${parameter//string/replace} --- 替換變數中字串內容, 使用replace字串替換所有匹配的string字串資訊
[[email protected] scripts]# echo ${oldboy/abc/cba}
cbaefgabcefg
[[email protected] scripts]# oldboy="abcefgabcefg"
[[email protected] scripts]# echo ${oldboy//abc/cba}
cbaefgcbaefg
變數替換
$(value:-word) ---當變數未定義或者值為空時,返回值為word內容,否則返回變數的值。
[[email protected] scripts]# oldboy=
[[email protected] scripts]# echo ${oldboy}
[[email protected] scripts]# echo ${oldboy:-laowang}
laowang
$(value:=word) ---若變數未定義或者值為空時,在返回word的值的同時將word賦值給value
[[email protected] scripts]# oldboy=
[[email protected] scripts]# echo ${oldboy:=laowang}
laowang
[[email protected] scripts]# oldboy=xiaogang
[[email protected] scripts]# echo ${oldboy:-laowang}
xiaogang
[[email protected] scripts]# echo ${oldboy:=laowang}
xiaogang
[[email protected] scripts]# oldboy=
[[email protected] scripts]# echo ${oldboy:-laowang}
laowang
[[email protected] scripts]# echo $oldboy
[[email protected] scripts]# echo ${oldboy:=laowang}
laowang
[[email protected] scripts]# echo $oldboy
laowang
$(value:?"word") ---定義一個變數如果存在時,輸出變數值; 定義變數不存在時,利用bash顯示指定報錯資訊
[[email protected] scripts]# echo ${oldboy:?error_info}
-bash: oldboy: error_info
[[email protected] scripts]# oldboy=123
[[email protected] scripts]# echo ${oldboy:?error_info}
123
$(value:+word) ---未定義value的數值,即沒有變數值,無輸出;
定義了value的變數資訊,即有變數值儲存在,可以輸出1用於表示有變數存在
[[email protected] scripts]# echo $oldboy
[[email protected] scripts]# echo ${oldboy:+1}
[[email protected] scripts]# echo ${oldboy:+0}
[[email protected] scripts]# oldboy=123456
[[email protected] scripts]# echo ${oldboy:+0}
0
[[email protected] scripts]# echo ${oldboy:+abc}
abc
企業擴充套件
01.i am a cool boy ,取出小於3的字串
cat test03.sh
for n in i am a cool boy;
do
if [ ${#n} -lt 3 ];
then
echo $n;
fi
done