linux中$符號的用法草集

linux使用版本: CentOS 7linux

[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腳本的時候,隨處可見$的身影。因爲他的變幻無窮,多種多樣,使對他的掌握和使用,尤爲是記憶帶來了挑戰,因此,如今,咱們來一塊兒將它的用法作一次彙總,造成草集。掌握他們不會讓你工資大漲,由於面試不會問到,可是會提升你的工做效率,擴展你的視野git

目前,我所知道的$用法有$、"$"、$0 $1 $n、$#、$@ $*、$?、$()、${}、${#}、$[]、$-、$!、$$。額外!$,!!,依次詳說github

$ 獲取變量值

$可獲取變量的值面試

[root@izbp10lqlgy2g31s41bt94z ~]# a=1
[root@izbp10lqlgy2g31s41bt94z ~]# echo $a
1
複製代碼

"$" 獲取變量值時最好使用"括起來

爲何有這個建議呢,看實例shell

[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"bash

[root@izbp10lqlgy2g31s41bt94z ~]# [ "$a" == "i am skyler" ]
[root@izbp10lqlgy2g31s41bt94z ~]# echo $?
0
複製代碼

使用雙引號後就能夠了,這裏提早用了下$?,他的意思是判斷前一個命令執行結果是否正確。輸出的結果中,0表示執行成功,非零值表示出錯ui

${}用於區分變量的邊界,明確告訴程序要取哪一個變量的值

以下實例,不加{}程序沒法判斷aab $abc哪一個是變量,沒法解析spa

[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可執行文件code

建立一個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」三個變量,*的值爲」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中$符號的用法草集

相關文章
相關標籤/搜索