一、shell中特殊且重要的變量
1、特殊位置變量
在shell中存在着一些特殊且重要的變量,例如:$0、$1、$#,我們可以稱之爲特殊位置變量。要想從命令行、函數或腳本執行等傳遞參數時,就需要在Shell腳本中使用位置參數變量。
常用的特殊位置參數變量,如圖:
舉例說明:
$0
[root@localhost ~]# cat a.sh
echo $0
[root@localhost ~]# sh a.sh
a.sh
[root@localhost ~]# sh /root/a.sh
/root/a.sh
[root@localhost ~]# dirname /root/a.sh
/root
//只輸出路徑名稱
[root@localhost ~]# basename /root/a.sh
a.sh
//只輸出腳本名稱
$n
[root@localhost ~]# cat a.sh
echo $1 $2 $3 $4 $5
[root@localhost ~]# sh a.sh a b c d e f
a b c d e
[root@localhost ~]# cat a.sh
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
[root@localhost ~]# sh a.sh {a..z}
a b c d e f g h i a0 a1 a2 a3 a4 a5
//輸出第10個位置參數時就不正常了
[root@localhost ~]# cat a.sh
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}
[root@localhost ~]# sh a.sh {a..z}
a b c d e f g h i j k l m n o
//這樣就正常了,位置變量大於9,數字必須用“{}”括起來
$#
[root@localhost ~]# cat a.sh
echo $#
[root@localhost ~]# sh a.sh a b c d e f
6
**$***
[root@localhost ~]# cat a.sh
echo $*
[root@localhost ~]# sh a.sh "a b" c d e
a b c d e
$@
[root@localhost ~]# cat a.sh
echo $@
[root@localhost ~]# sh a.sh "a b" c d e
a b c d e f
不帶引號的“$*”和“$@”輸出的結果是一樣的!
*"$"**
[root@localhost ~]# cat a.sh
for i in "$*";do echo $i;done
[root@localhost ~]# sh a.sh "a b" c d e
a b c d e
"$@"
[root@localhost ~]# cat a.sh
for i in "$@";do echo $i;done
[root@localhost ~]# sh a.sh "a b" c d e
a b
c
d
e
2、特殊狀態變量
如圖:
舉例說明:
$?
[root@localhost ~]# pwd
/root
[root@localhost ~]# echo $?
0
[root@localhost ~]# fsdafasdf
bash: fsdafasdf: 未找到命令...
[root@localhost ~]# echo $?
127
//執行正確的命令返回值是0,不正確的是非0。
[root@localhost ~]# cat a.sh
if
[ $# -ne 2 ]
then
echo "cuowu!"
exit 123 //執行腳本錯誤時,$?的值爲123
fi
[root@localhost ~]# sh a.sh
cuowu!
[root@localhost ~]# echo $?
123
這個命令對於新手來說,非常有用!
“$?”返回值的用法:
- 判斷命令、腳本或函數等程序是否執行成功;
- 若在腳本中調用執行“exit 數字”,則會返回這個數字給“$?”變量;
- 如果是在函數裏,則通過“return數字”把這個數字以函數返回值的形式傳給“$?”變量;
剩下的有關“$$”、“$!”、“$_”不太常用,這裏也不舉例說明了!
二、shell內置變量命令
shell中包含一些內置命令,這些內置命令在目錄列表裏是看不到的,它們由shell本身提供。常用的內部命令有:echo、eval、exec、export、read、shift。接下來了解一下這些命令的功能。
echo命令
將echo命令後面指定的字符串及變量等內容顯示到標準輸出。
echo的常用的參數,如圖:
舉例說明:
[root@localhost ~]# echo one;echo two
one
two
[root@localhost ~]# echo -n one;echo two
onetwo
//不換行輸出
[root@localhost ~]# echo -e "one\ttwo\nthree\tfour"
one two
three four
//之間的空隙就是“\t”的作用,“\n”換行
[root@localhost ~]# echo -e "1\b23"
23
//“\b”的作用是退格,所以把1擋住了
關於echo命令很常用的,也沒什麼難度,所以就介紹這麼多!
關於eval命令不太常用,本人也沒怎麼使用過,就不班門弄斧了!
exec命令:
exec命令能夠在不創建新的子進程的前提下,轉去執行指定的命令,當指定的命令執行完畢後,該進程(也就是最初的Shell)也就終止了,示例如下:
[root@localhost ~]# exec date
Sun Sep 15 12:05:22 CST 2019
[lisi@localhost ~]$
//退回到特權模式
read命令:
從標準輸入字符串等信息,傳給Shell程序內部定義的變量。
shift命令:
將位置參數$1、$2等進行左移,如果位置變量是$1、$2、$3,那執行一次shift後,$3就變成了$2,$2就變成了$1,$1也就消失了。
三、shell變量字符串
常用的選項舉例:
(1)查詢字符長度值
舉例說明:
定義變量:
[root@localhost ~]# a=abcdef
[root@localhost ~]# echo ${a}
abcdef
[root@localhost ~]# echo $a
abcdef
返回變量值的長度
[root@localhost ~]# echo ${#a}
6
擴展:
[root@localhost ~]# echo $a | wc -L
6
//使用wc命令統計長度
[root@localhost ~]# expr length "$a"
6
//使用expr的length函數計算
[root@localhost ~]# echo "$a" | awk '{print length($0)}'
6
//使用awk的length函數計算變量長度
這幾張方式,最快的就是${#變量名}這種方式
(2)截取字符長度
定義變量:
[root@localhost ~]# a="a b c d e f"
[root@localhost ~]# echo ${a}
a b c d e f
截取變量中的內容,從第二個字符開始截取(默認截取到最後)
[root@localhost ~]# echo ${a:2}
b c d e f
截取變量中的內容,從第二個字符開始截取2個字符
第一種方法:
[root@localhost ~]# echo ${a:2:4}
b c
//因爲空格也算字符
第二種方法:
[root@localhost ~]# echo ${a} | cut -c 3-5
b c
(3)刪除指定字符
定義變量:
[root@localhost ~]# a=abcABC123ABCabc
[root@localhost ~]# echo $a
abcABC123ABCabc
[root@localhost ~]# echo ${a#a*c}
ABC123ABCabc
[root@localhost ~]# echo ${a#a*C}
123ABCabc
//從變量內容的開頭開始刪除最短匹配a*c及a*C的字符串
[root@localhost ~]# echo ${a##a*c}
//因爲全部符合要求,所以就不顯示了
[root@localhost ~]# echo ${a##a*C}
abc
//從變量內容的開頭開始刪除最長匹配a*c及a*C的字符串
[root@localhost ~]# echo ${a%a*c}
abcABC123ABC
[root@localhost ~]# echo ${a%a*C}
abcABC123ABCabc
//從變量內容的結尾開始刪除最短匹配a*c及a*C的字符串
[root@localhost ~]# echo ${a%%a*c}
[root@localhost ~]# echo ${a%%a*C}
abcABC123ABCabc
//從變量內容的結尾開始刪除最長匹配a*c及a*C的字符串
關於刪除字符的小結:
- #:表示從開頭刪除匹配最短;
- ##:表示從開頭刪除匹配最長;
- %:表示從結尾刪除匹配最短;
- %%:表示從結尾刪除匹配最長;
ac匹配的字符,表示所有,以a開頭,以c結尾;
aC匹配的字符,表示所有,以a開頭,以C結尾;
(4)替換指定字符
定義變量:
[root@localhost ~]# a="abc abc"
[root@localhost ~]# echo $a
abc abc
[root@localhost ~]# echo ${a/abc/ABC}
ABC abc
//替換第一個符合要求的字符
[root@localhost ~]# echo ${a//abc/ABC}
ABC ABC
//替換所有符合要求的字符
有關替換的小結:
- 一個“/”表示替換匹配的第一個字符串;
- 兩個“//”表示替換匹配的所有字符串;
四、特殊擴展變量
常用選項,如圖:
不太常用,這裏就不舉例說明了!