三、SHELL變數知識進階與實踐 (一)shell特殊位置變數 1.獲取腳本的名字($0) 2、獲取腳本的第n個參數($n) 3、獲取腳本的所有參數個數($ ) 4、獲取腳本的所有參數 (二)shell進程特殊狀態變數 (三)shell變數子串知識及實踐(變數內容) 1、獲取變數長度 2、匹配變數子 ...
三、SHELL變數知識進階與實踐
(一)shell特殊位置變數
1.獲取腳本的名字($0)
$0:獲取腳本的名字,如果腳本前跟著路徑的話,那就獲取路徑加上腳本名字。
企業應用:一般在腳本最後,使用$0獲取腳本的路徑和名字給用戶。
2、獲取腳本的第n個參數($n)
$n:獲取腳本後的第n個參數,n大於9以後,數字需要用大括弧括起來。
企業應用:腳本中,提取第n個參數。
3、獲取腳本的所有參數個數($#)
$#:腳本後所有參數的個數。
企業應用:判斷參數個數。
4、獲取腳本的所有參數
$*:獲取shell腳本中所有的參數。所有單數是一個整體:"$1,$2,$3"
$@:獲取腳本的所有參數。每個參數是一個整體:"$1","$2","$3"
當需要接收腳本後所有參數,但是又不知道個數的時候,使用$*,$#
兩者區別:
[root@centos6-kvm3 scripts]# cat test.sh
#!/bin/bash
for arg in "$*"
do
echo $arg
done
echo ------
for arg1 in "$@"
do
echo $arg1
done
echo $#
[root@centos6-kvm3 scripts]# bash test.sh "i am" oldboy teacher.
i am oldboy teacher.
------
i am
oldboy
teacher.
3
[root@centos6-kvm3 scripts]#
(二)shell進程特殊狀態變數
①$?:獲取上一個命令的返回值,返回值為0,表示成功,非0,表示失敗。
②$$:獲取當前執行腳本的進程號。
③$!:獲取上一個後臺工作的進程的進程號。
④$_:獲取在此前執行命令或者腳本的最後一個參數。
(三)shell變數子串知識及實踐(變數內容)
1、獲取變數長度
[root@centos6-kvm3 scripts]# oldboy="i am oldboy"
[root@centos6-kvm3 scripts]# echo ${oldboy}
i am oldboy
${#變數}:獲取變數字元個數。
[root@centos6-kvm3 scripts]# echo ${#oldboy}
11
[root@centos6-kvm3 scripts]# echo ${oldboy}|wc -L
11
計算變數字元個數方法2:
[root@centos6-kvm3 scripts]# expr length "$oldboy"
11
計算變數字元個數方法3:
[root@centos6-kvm3 scripts]# echo $oldboy| awk '{print length }'
11
[root@centos6-kvm3 scripts]# echo $oldboy| awk '{print length($0) }'
11
[root@centos6-kvm3 scripts]# echo $oldboy| awk '{print length($1) }'
1
獲取變數第二個參數後參數:
[root@centos6-kvm3 scripts]# echo ${oldboy:2}
am oldboy
[root@centos6-kvm3 scripts]# echo ${oldboy:2:2}
am
[root@centos6-kvm3 scripts]#
2、匹配變數子串
${參數#字元串}:匹配開頭,刪除最短匹配。
[root@centos6-kvm3 scripts]# OLDBOY=abcABC12345ABCabc
[root@centos6-kvm3 scripts]# echo ${OLDBOY}
abcABC12345ABCabc
[root@centos6-kvm3 scripts]# echo ${OLDBOY#a*C}
12345ABCabc
${參數##字元串}:匹配開頭,刪除最長匹配。
[root@centos6-kvm3 scripts]# echo ${OLDBOY##a*C}
abc
${參數%字元串}:匹配結尾,刪除最短匹配。
[root@centos6-kvm3 scripts]# echo ${OLDBOY%a*c}
abcABC12345ABC
${參數%%字元串}:匹配結尾,刪除最長匹配。
[root@centos6-kvm3 scripts]# echo ${OLDBOY%%a*c}
[root@centos6-kvm3 scripts]#
3、替換字元串里的子串
${變數/part/string}:使用string替換part第一個匹配項。
[root@centos6-kvm3 scripts]# oldboy="i am oldboy oldboy"
[root@centos6-kvm3 scripts]# echo ${oldboy/oldboy/oldgirl}
i am oldgirl oldboy
${變數//part/string}:使用string替換part所有匹配項。
[root@centos6-kvm3 scripts]# echo ${oldboy//oldboy/oldgirl}
i am oldgirl oldgirl
[root@centos6-kvm3 scripts]#
(四)shell特殊變數擴展知識
1、變數臨時賦值
result=${變數:-word}:當變數為空時候,將word賦值給result。冒號可以省略。
[root@centos6-kvm3 scripts]# result=${test:-UNSET}
[root@centos6-kvm3 scripts]# echo $result
UNSET
[root@centos6-kvm3 scripts]# echo $test
企業應用:
[root@centos6-kvm3 scripts]# find ${path:-/tmp} -name "*.log" -mtime +7| xargs rm -f
[root@centos6-kvm3 scripts]#
2、變數賦值
result=${變數:=word},變數為空時候,work複製給result,同時複製給變數。
[root@centos6-kvm3 scripts]# result=${test:=UNSET}
[root@centos6-kvm3 scripts]# echo ${result}
UNSET
[root@centos6-kvm3 scripts]# echo ${test}
UNSET
[root@centos6-kvm3 scripts]#
3、變數賦值提示
${變數:?word}:當變數為空時候,提示word。
[root@centos6-kvm3 scripts]# result=${test1:?變數為空}
-bash: test1: 變數為空
[root@centos6-kvm3 scripts]# echo $result
UNSET
[root@centos6-kvm3 scripts]# echo $test1
[root@centos6-kvm3 scripts]# test1=oldboy
[root@centos6-kvm3 scripts]# result=${test1:?變數為空}
[root@centos6-kvm3 scripts]# echo $result
oldboy
[root@centos6-kvm3 scripts]#
4、變數賦值覆蓋
${變數:+word}:如果前面變數為空,什麼不做,如果不為空,進行覆蓋。
[root@centos6-kvm3 scripts]# result1=${test2:+wordk}
[root@centos6-kvm3 scripts]# echo ${result1}
[root@centos6-kvm3 scripts]# echo ${test2}
[root@centos6-kvm3 scripts]# test2=2
[root@centos6-kvm3 scripts]# result1=${test2:+wordk}
[root@centos6-kvm3 scripts]# echo ${result1}
wordk
[root@centos6-kvm3 scripts]# echo ${test2}
2
[root@centos6-kvm3 scripts]#