linux中$符號的用法草集
linux使用版本: CentOS 7
[root@azfdbdfsdf230lqdg1ba91 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@azfdbdfsdf230lqdg1ba91 ~]# uname -a
Linux azfdbdfsdf230lqdg1ba91 3.10.0-693.2.2.el7.x86_64 #1 SMP Tue Sep 12 22:26:13 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@azfdbdfsdf230lqdg1ba91 ~]#
複製程式碼
$符號草集
目標
$符號在linux系統的有著很多很重要的作用,特別是在編寫bash指令碼的時候,隨處可見$的身影。由於他的千變萬化,多種多樣,使對他的掌握和使用,尤其是記憶帶來了挑戰,所以,現在,我們來一起將它的用法做一次彙總,形成草集。掌握他們不會讓你工資大漲,因為面試不會問到,但是會提高你的工作效率,擴充套件你的視野
目前,我所知道的$用法有$、"$"、$0 $1 $n、$#、$@ $*、$?、$()、${}、${#}、$[]、$-、$!、$$。額外!$,!!,依次詳說
$
獲取變數值
$
可獲取變數的值
[root@izbp10lqlgy2g31s41bt94z ~]# a=1
[root@izbp10lqlgy2g31s41bt94z ~]# echo $a
1
複製程式碼
"$"
獲取變數值時最好使用"括起來
為什麼有這個建議呢,看例項
[root@izbp10lqlgy2g31s41bt94z ~]# echo get value of a = $a
get value of a = 1
[root@izbp10lqlgy2g31s41bt94z ~]# echo "get value of a = $a"
get value of a = 1
複製程式碼
可以看到,有無"
雙引號括起來似乎效果是一樣的。別早下結論,往下看
[root@izbp10lqlgy2g31s41bt94z ~]# a="i am skyler"
[root@izbp10lqlgy2g31s41bt94z ~]# [ $a == "i am skyler" ]
-bash: [: 引數太多
複製程式碼
這裡解析下[]
,[]
是條件判斷符號,相當於test
命令。他的意思是判斷a變數的值是否等於"i am skyler"
。
那麼為什麼會報錯呢,因為[ $a == "i am skyler"
]這種寫法變數解析後成為[ i am skyler == "i am skyler" ]
,很明顯,這個判斷式無法判斷等號兩邊的字串,我們想要的是[ "i am skyler" == "i am skyler" ]
的比較。所以平時我們在是name"
[root@izbp10lqlgy2g31s41bt94z ~]# [ "$a" == "i am skyler" ]
[root@izbp10lqlgy2g31s41bt94z ~]# echo $?
0
複製程式碼
使用雙引號後就可以了,這裡提前用了下$?
,他的意思是判斷前一個命令執行結果是否正確。輸出的結果中,0表示執行成功,非零值表示出錯
${}
用於區分變數的邊界,明確告訴程式要取哪個變數的值
如下例項,不加{}程式無法判斷ab $abc哪個是變數,無法解析
[root@izbp10lqlgy2g31s41bt94z ~]# echo "get value of a = $abc"
get value of a =
[root@izbp10lqlgy2g31s41bt94z ~]# echo "get value of a = ${a}bc"
get value of a = 1bc
[root@izbp10lqlgy2g31s41bt94z ~]#
複製程式碼
${#}
獲取變數值的長度
[root@izbp10lqlgy2g31s41bt94z ~]# echo "get length of a = ${#a}"
get length of a = 1
[root@izbp10lqlgy2g31s41bt94z ~]# a=11111
[root@izbp10lqlgy2g31s41bt94z ~]# echo "get length of a = ${#a}"
get length of a = 5
[root@izbp10lqlgy2g31s41bt94z ~]# a=skyler
[root@izbp10lqlgy2g31s41bt94z ~]# echo "get length of a = ${#a}"
get length of a = 6
[root@izbp10lqlgy2g31s41bt94z ~]#
複製程式碼
$0 $1 $n
獲取檔名稱和引數值,一般在bash指令碼中較多
$0
表示shell指令碼檔名;從1開始表示第幾個引數,1表示第一個引數。這裡我們建立一個test.sh可執行檔案
建立一個test.sh檔案並填充程式碼
[root@izbp10lqlgy2g31s41bt94z ~]# echo 'echo $0 $1 $2' > test.sh
[root@izbp10lqlgy2g31s41bt94z ~]# cat test.sh
echo $0 $1 $2
執行test.sh 並傳入變數
[root@izbp10lqlgy2g31s41bt94z ~]# sh test.sh i am skyler
test.sh i am
複製程式碼
可以看到,三個引數中前兩個打印出來了,因為我們沒有宣告$3,所有打印出了檔名稱和前兩個引數
$#
獲取引數數量
[root@izbp10lqlgy2g31s41bt94z ~]# echo 'echo $# $0 $1' > test.sh
[root@izbp10lqlgy2g31s41bt94z ~]# cat test.sh
echo $# $0 $1
[root@izbp10lqlgy2g31s41bt94z ~]# sh test.sh I am a shuashua
4 test.sh I
複製程式碼
$@ $*
陣列的形式引用引數列表
它們的區別在於使用雙引號括起來用時,假設傳入的引數為1 2 3,那麼"*的值為”1 2 3”一個變數
test.sh
echo '$@的陣列引數格式'
for x in "$@"
do
echo + $x
done
echo '$*的陣列引數格式'
for x in "$*"
do
echo + $x
done
root@izbp10lqlgy2g31s41bt94z:~# sh test.sh 1 2 3
$@的陣列引數格式
+ 1
+ 2
+ 3
$*的陣列引數格式
+ 1 2 3
複製程式碼
$?
判斷上一個命令執行是否成功
執行成功值時0,失敗是非0
[root@izbp10lqlgy2g31s41bt94z ~]# ll
總用量 172
-rw-r--r-- 1 root root 49392 2月 25 2019 hs_err_pid24203.log
-rw-r--r-- 1 root root 49425 2月 13 2019 hs_err_pid25726.log
[root@izbp10lqlgy2g31s41bt94z ~]# echo $?
0
[root@izbp10lqlgy2g31s41bt94z ~]# ca ff
-bash: ca: 未找到命令
[root@izbp10lqlgy2g31s41bt94z ~]# echo $?
127
複製程式碼
$()
等同於使用雙引號的作用
略
複製程式碼
$[]
表示式計算
此時的[]不是用於判斷式的場景,[]作為判斷式一般用於bash腳步中if while等條件語句
[root@izbp10lqlgy2g31s41bt94z ~]# echo $[5 + 5]
10
複製程式碼
$-
顯示shell所使用的當前選項
[root@izbp10lqlgy2g31s41bt94z ~]# echo $-
himBH
解釋:himBH每一個字元是一個shell的選項,詳情man bash然後搜尋 -h -B 等。詳情參考:http://kodango.com/explain-shell-default-options
複製程式碼
$!
獲取後臺執行最後一個程式的pid,更多應用在bash指令碼
[root@izbp10lqlgy2g31s41bt94z ~]# cat test.sh &
[1] 362
[root@izbp10lqlgy2g31s41bt94z ~]# echo $# $0 $1
^C
[1]+ 完成 cat test.sh
[root@izbp10lqlgy2g31s41bt94z ~]# echo $!
362
複製程式碼
!$
將上一條命令的引數傳遞給下一條命令的引數,平時用於更方便,更多應用在bash指令碼
[root@izbp10lqlgy2g31s41bt94z ~]# cd /Users/skyler/project/test
[root@izbp10lqlgy2g31s41bt94z ~]# ll !$
[root@izbp10lqlgy2g31s41bt94z ~]# ll /Users/skyler/project/test
362
複製程式碼
!!
將上一條命令輸出 ,平時用於更方便,更多應用在bash指令碼
[root@izbp10lqlgy2g31s41bt94z ~]# !!
[root@izbp10lqlgy2g31s41bt94z ~]# ll /Users/skyler/project/test
複製程式碼
$$
獲取當前程式pid
[root@izbp10lqlgy2g31s41bt94z ~]# echo $$
31268
[root@izbp10lqlgy2g31s41bt94z ~]# ps -ef|grep 31268
root 31268 31266 0 08:10 pts/0 00:00:00 -bash
複製程式碼
當前的程式是bash,pid是31268
平日多加練習,用時隨心索取
原味地址: linux中$符號的用法草集