Shell變量知識進階

一、shell中特殊且重要的變量

1、特殊位置變量

在shell中存在着一些特殊且重要的變量,例如:$0、$1、$#,我們可以稱之爲特殊位置變量。要想從命令行、函數或腳本執行等傳遞參數時,就需要在Shell腳本中使用位置參數變量。

常用的特殊位置參數變量,如圖:
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、特殊狀態變量

如圖:
Shell變量知識進階

舉例說明:
$?

[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的常用的參數,如圖:
Shell變量知識進階

舉例說明:

[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變量字符串

常用的選項舉例:
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
//替換所有符合要求的字符

有關替換的小結:

  • 一個“/”表示替換匹配的第一個字符串;
  • 兩個“//”表示替換匹配的所有字符串;

四、特殊擴展變量

常用選項,如圖:

Shell變量知識進階
不太常用,這裏就不舉例說明了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章