bash中特殊符號含義-總結


bash中特殊符號含義

2022/02/ 陳信

參考:

https://cloud.tencent.com/developer/article/1469049

https://www.cnblogs.com/duhuo/p/7133204.html

1. # 井號-注釋

注釋符號(Hashmark[Comments])

1.在shell文件的行首,作為shebang標記,#!/bin/bash;

\2. 其他地方作為注釋使用,在一行中,#后面的內容並不會被執行,除非;

\3. 但是用單/雙引號包圍時,#作為#號字符本身,不具有注釋作用。

2. ; 分號-語句分隔

作為多語句的分隔符(Command separator [semicolon])。

多個語句要放在同一行的時候,可以使用分號分隔。注意,有時候分號需要轉義。

3. ;; 雙分號-case語句

連續分號(Terminator [double semicolon])。

在使用case選項的時候,作為每個選項的終結符。

在Bash version 4+ 的時候,還可以使用[;;&], [;&]

4. . 點號-source/正則

點號(dot command [period])。

\1. 相當於bash內建命令source,如:

#!/bin/bash
. data-file
#包含data-file;

\2. 作為文件名的一部分,在文件名的開頭,表示該文件為隱藏文件,ls一般不顯示出來(ls -a 可以顯示);

\3. 作為目錄名,一個點代表當前目錄,兩個點號代表上層目錄(當前目錄的父目錄)。注意,兩個以上的點不出現,除非你用引號(單/雙)包圍作為點號字符本身;

\4. 正則表達式中,點號表示任意一個字符。

5. " 雙引號-允許變量擴展

雙引號(partial quoting [double quote])。

部分引用。

雙引號包圍的內容可以允許變量擴展,也允許轉義字符的存在。

如果字符串內出現雙引號本身,需要轉義,因此雙引號不一定是成對的。

6. ' 單引號-禁止變量擴展

單引號(full quoting [single quote])。

單引號括住的內容,被視為單一字符串,引號內的禁止變量擴展,所有字符均作為字符本身處理(除單引號本身之外),單引號必須成對出現。

7. , 逗號-數學表達式中

逗號(comma operator [comma])。

\1. 用在連接一連串的數學表達式中,這串數學表達式均被求值,但只有最后一個求值結果被返回。如:

#!/bin/bash
let t1=((a=5+1, b=7+2))
echo t1=$t1, a=$a, b=$b
## 這個$t1=$b;

\2. 用於參數替代中,表示首字母小寫,如果是兩個逗號,則表示全部小寫,注意,這個特性在bash version 4的時候被添加的。

a="ATest"
echo ${a,}
echo ${a,,}
## 前面輸出aTest,后面輸出的是atest。

8. / 斜線-目錄/除法

斜線,斜桿(Filename path separator [forward slash])。

1.作為路徑的分隔符,路徑中僅有一個斜桿表示根目錄,以斜桿開頭的路徑表示從根目錄開始的路徑;

2.在作為運算符的時候,表示除法符號。如:a=4/2

9. \ 反斜線-轉義

反斜線,反斜桿(escape [backslash])。

\1. 放在特殊符號之前,轉義特殊符號的作用,僅表示特殊符號本身,這在字符串中常用;

\2. 放在一行指令的最末端,表示緊接着的回車無效(其實也就是轉義了Enter),后繼新行的輸入仍然作為當前指令的一部分。

10. ` 反引號/后引號-命令替換

反引號,后引號(Command substitution[backquotes])。

命令替換。這個引號包圍的部分為命令,可以執行包圍的命令,並將執行的結果賦值給變量。

如:a=dirname '/tmp/x.log'

返回的結果會賦值給a,注意,此處特地使用了反引號和單引號,注意區別。

11. : 冒號-空命令

冒號(null command [colon])。

空命令,這個命令什么都不做,但是有返回值,返回值為0(即:true)。這個命令的作用非常奇妙。

\1. 可做while死循環的條件;

\2. 在if分支中作為占位符(即某一分支什么都不做的時候);

\3. 放在必須要有兩元操作的地方作為分隔符,如:: ${username=whoami}

\4. 在參數替換中為字符串變量賦值,在重定向操作(>)中,把一個文件長度截斷為0(:>>這樣用的時候,目標存在則什么都不做),這個只能在普通文件中使用,不能在管道,符號鏈接和其他特殊文件中使用;

\5. 甚至你可以用來注釋(#后的內容不會被檢查,但:后的內容會被檢查,如果有語句如果出現語法錯誤,則會報錯);

\6. 你也可以作為域分隔符,比如環境變量$PATH中,或者passwd中,都有冒號的作為域分隔符的存在;

\7. 你也可以將冒號作為函數名,不過這個會將冒號的本來意義轉變(如果你不小心作為函數名,你可以使用unset -f : 來取消function的定義)。

12. ! 感嘆號-取反

感嘆號(reverse (or negate) [bang],[exclamation mark])。

取反一個測試結果或退出狀態。

\1. 表示反邏輯,比如后面的!=,這個是表示不等於;

\2. 表示取反,如:ls a[!0-9] #表示a后面不是緊接一個數字的文件;

\3. 在不同的環境里面,感嘆號也可以出現在間接變量引用里面;

\4. 在命令行中,可以用於歷史命令機制的調用,你可以試試!$,!#,或者!-3看看,不過要注意,這點特性不能在腳本文件里面使用(被禁用)。

感嘆號的使用(轉義) 
#!/bin/bash 
test='hello!@#$%-test'    # 注意,等號兩邊不能有空格,否則會將嘆號當做歷史命令調用來處理 
echo  $test 
echo "you !!!" 
test2="test2!" 
echo $test2 
注意:    shell編程里,等號兩邊不應該有空格(跟其他任何語言都不同,這是bash/sh等的特例). 

13. * 星號-通配符/乘法

星號(wildcard/arithmetic operator[asterisk])。

\1. 作為匹配文件名擴展的一個通配符,能自動匹配給定目錄下的每一個文件;

\2. 正則表達式中可以作為字符限定符,表示其前面的匹配規則匹配任意次;

\3. 算術運算中表示乘法。

14. ** 雙星號-求冪

雙星號(double asterisk)。算術運算中表示求冪運算。

15. ? 問號-條件測試/通配符

問號(test operator/wildcard[Question mark])。

\1. 表示條件測試;

\2. 在雙括號內表示C風格的三元操作符((condition?true-result:false-result));

\3. 參數替換表達式中用來測試一個變量是否設置了值;

\4. 作為通配符,用於匹配文件名擴展特性中,用於匹配單個字符;

\5. 正則表達式中,表示匹配其前面規則0次或者1次。

16. $ 美元符-變量/行末

美元符號(Variable substitution[Dollar sign])。

\1. 作為變量的前導符,用作變量替換,即引用一個變量的內容,比如:echo $PATH;

\2. 在正則表達式中被定義為行末(End of line)。

17. ${}-變量

參數替換(Variable substitution)。

用於在字符串中表示變量。

17. ${!#} ${@🅰️b} 參數的操作

./example.sh -a 1 -b 2 -c 3 -d

參數總個數不確定,從腳本參數的第n個位置開始取參數

參數位置 獲取技巧 ${@🅰️b}

$# 表示參數個數,如 echo $#

1.格式

${!#}   取最后一個參數 
${@:a:b}  從第a個參數開始取,合計取b個. 如取到最后一個,則":b"可以不寫.有些類似python的切片方式. 

2.常見示例 ${!#} ${@:1:$#-1}

./t.sh 1001 1002 1003 1004 1005 目的要賦值給變量a=1005 , b="1001 1002 1003 1004",則腳本內容為

a=${!#}        
#取最后一個參數 

b=${@:1:$#-1}     
#從第1個參數開始,合計取$#-1個.
其中$@是列表形式列出所有的傳入參數;
然后:1是從第一個參數開始,后面不加任何東西的話是一直到結尾;
若加:$#-1是"$#參數總個數-1",即從第1個參數開始,合計取$#-1個參數. 

若要取倒數第二個參數即c=1004: c=${@😒#-1:1} #@:開始位置(倒數第2個):合計取1個

從第3個參數位置獲取: directory=${@:3:$#} #從第3個參數開始,取所有(取$#個,顯然取不到這么多個,但取到最后的時候,shell自動會判斷結束)

其他示例說明:

a=${@:2:$#-2} 
從第2個開始,合計取參數個數減2個

b=${!#} 
取最后一個

c=${@:$#-3:$#} 
取倒數第3個位置開始,取參數總個數這么多.
(能夠取到的參數肯定比參數總個數少,因為是從倒數第三個開始取的.除非從第一個開始取);

d=${@:$#-3} 
取倒數第3個位置開始,全部取完.同上;

18. ${var:offset:number}-字符串切片

擴展 字符串切片

參考: https://www.cnblogs.com/alongdidi/p/bash_parameter_expansion.html

這塊在上一篇講解數組的文章中,也大概提到了Shell Parameter Expansion除了可以對數組(array)切片以外,還可以對變量切片。

格式:

${var:offset:number}

${var: length}

[root@c7-server ~]# name="zhangwenlong"
[root@c7-server ~]# echo ${name}
zhangwenlong

[root@c7-server ~]# echo ${name:2:5}
angwe

[root@c7-server ~]# echo ${name: -4}
long

19. ${var^^} ${var,,}-字符大小寫轉換

字符大小寫轉換

格式:

${var^^}:將變量var中的所有小寫字符轉換成大寫。

${var,,}:將變量var中的所有大寫字符轉換成小寫。

[root@c7-server ~]# name=RenDanChaoXian[root@c7-server ~]# echo ${name^^}RENDANCHAOXIAN[root@c7-server ~]# echo ${name,,}rendanchaoxian

20. $‘...’-引用內容展開(未找到示例)

$‘...’ 引用內容展開,執行單引號內的轉義內容(單引號原本是原樣引用的),這種方式會將引號內的一個或者多個[]轉義后的八進制,十六進制值展開到ASCII或Unicode字符。

21. $*或$@-位置參數

位置參數(Positional Parameters)。

這個在使用腳本文件的時候,在傳遞參數的時候會用到。

兩者都能返回調用腳本文件的所有參數.

但$*是將所有參數作為一個整體返回(字符串);

而$@是將每個參數作為單元返回一個參數列表。

注意,在使用的時候需要用雙引號將$*,$@括住。

這兩個變量受到$IFS的影響,如果在實際應用中,要考慮其中的一些細節。

補充:

shell特殊 參數 變量 $#,$@,$*,$$,$?,$0,$1的含義解釋 整理時間: 20180718 Chenxin shell的特殊字符  $#     是傳給腳本的參數個數(不含腳本文件自身) $0     是腳本本身的名字 $1~$n 是傳遞給該shell腳本的第1-n個參數 $@     所有參數列表.以"$1" "$2" … "$n" 的形式輸出所有參數。 $*       所有參數列表.以"$1 $2 … $n"的形式輸出所有參數。是以一個單字符串顯示所有向腳本傳遞的參數. $$     是腳本運行的當前進程ID號 $?     是顯示最后命令的退出狀態,0表示沒有錯誤,其他表示有錯誤 ${!#}    輸出最后一個參數 $!    Shell最后運行的后台Process的PID 完整的特殊字符含義: https://linux.cn/article-5657-1.html  

21. $#-參數數量

表示傳遞給腳本的參數數量。

22. $?-返回值

此變量值在使用的時候,返回的是最后一個命令、函數、或腳本的退出狀態碼值,如果沒有錯誤則是0,如果為非0,則表示在此之前的最后一次執行有錯誤。

23. $$-進程PID

進程ID變量,這個變量保存了運行當前腳本的進程ID值。

24. ()-命令組subshell/數組初始化

圓括號(parentheses)。

1, 命令組(Command group)。由一組圓括號括起來的命令是命令組,命令組中的命令是在子shell(subshell)中執行。因為是在子shell內運行,因此在括號外面是沒有辦法獲取括號內變量的值,但反過來,命令組內是可以獲取到外面的值,這點有點像局部變量和全局變量的關系,在實際中,如果碰到要cd到子目錄操作,並在操作完成后要返回到當前目錄的時候,可以考慮使用subshell來處理;

\2. 用於數組的初始化。

25. {x,y,z,...} 花括號擴展

花括號擴展(Brace Expansion)。

在命令中可以用這種擴展來擴展參數列表,命令將會依照列表中的括號分隔開的模式進行匹配擴展。注意的一點是,這花括號擴展中不能有空格存在,如果確實有必要空格,則必須被轉義或者使用引號來引用。

例子:

chenxin@yunwei-01:~$ echo {a,b,c}-{\ d," e",' f'}a- d a- e a- f b- d b- e b- f c- d c- e c- f

26. {a..z} 花括號擴展

在Bash version 3時添加了這種花括號擴展的擴展,可以使用{A..Z}表示A-Z的所有字符列表,這種方式的擴展測試了一下,好像僅適用於A-Z,a-z,還有數字{最小..最大}的這種方式擴展。

27. {} 代碼塊

代碼塊(curly brackets)。

這個是匿名函數,但是又與函數不同,在代碼塊里面的變量在代碼塊后面仍能訪問。

注意:

花括號內側需要有空格與語句分隔。

另外,在xargs -i中的話,還可以作為文本的占位符,用以標記輸出文本的位置。

{ cmd1;cmd2; } :指令以當前進程pid執行;

(cmd1;cmd2) :指令以子進程pid執行;

28. {} ; 貌似只在find里用

這個{}是表示路徑名,這個並不是shell內建的,現在接觸到的情況看,好像只用在find命令里。

注意后面的分號,這個是結束find命令中-exec選項的命令序列,在實際使用的時候,要轉義一下,以免被shell理解錯誤。

29. [] 中括號-測試/數組元素/正則

中括號(brackets)。

\1. 測試的表示,Shell會測試在[]內的表達式,需要注意的是,[]是Shell內建的測試的一部分,而非使用外部命令/usr/bin/test的鏈接;

\2. 在數組的上下文中,表示數組元素,方括號內填上數組元素的位置就能獲得對應位置的內容,如:

chenxin@yunwei-01:~$ Array[1]=xxxchenxin@yunwei-01:~$ echo ${Array[1]};xxx

\3. 正則中,表示字符集的范圍,方括號表示該位置可以匹配的字符集范圍。

30. [[]] 雙中括號

雙中括號(double brackets)。

這個結構也是測試,測試[[]]之中的表達式(Shell的關鍵字)。

這個比單中括號更能防止腳本里面的邏輯錯誤,比如:&&,||,<,>操作符能在一個[[]]里面測試通過,但是在[]卻不能通過。[[]]里面沒有文件名擴展(filename expansion)或是詞分隔符(Word splitting),但是可以用參數擴展(Parameter expansion)和命令替換(command substitution)。不用文件名通配符和像空白這樣的分隔符。注意,這里面如果出現了八進制,十六進制等,shell會自動執行轉換比較。

31. $[...] 整數擴展,類似$(())

詞表達表示整數擴展(integer expansion)。

在方括號里面執行整數表達式。例:

chenxin@yunwei-01:~$ a=3chenxin@yunwei-01:~$ b=7chenxin@yunwei-01:~$ echo $[$a+$b]10chenxin@yunwei-01:~$ echo $[$a*$b]21##返回是10和21##這種很類似$(())的方式chenxin@yunwei-01:~$ echo $((a+b))10chenxin@yunwei-01:~$ echo $((a*b))21chenxin@yunwei-01:~$ echo $(( a * b ))21

32. (()) 雙小括號,整數擴展

雙括號(double parentheses)。

表示整數擴展(integer expansion)。

功能和上面的$[]差不多,但是需要注意的是,$[]是會返回里面表達式的值的,而(())只是執行,並不會返回值。

兩者執行后如果變量值發生變化,都會影響到后繼代碼的運行。可對變量賦值,可以對變量進行一目操作符操作,也可以是二目,三目操作符。

33. > , &< ,>&,>>,<,<> 重定向

重定向(redirection)。

scriptname >filename 重定向scriptname的輸出到文件filename中去,如果文件存在則覆蓋;

command &>filename 重定向command的標准輸出(stdout)和標准錯誤(stderr)到文件filename中;

command >&2 把command的標准輸出(stdout)重定向到標准錯誤(stderr)中;

scriptname >>filename 把scriptname的輸出(同>)追加到文件filenmae中,如果文件不存在則創建。

[i]<>filename 打開filename這個文件用來讀或者寫,並且給文件指定i為它的文件描述符(file descriptor),文件不存在就會創建。

34. (command)>,<(command) 進程替換

這是進程替換(Process Substitution)。

使用的時候注意,括號和<,>之間是不能有空格的,否則報錯。

其作用有點類似管道,但和管道在用法上又有些不同,管道是作為子進程的方式來運行的,這個命令會在/dev/fd/下面產生類似/dev/fd/63,/dev/fd/62這類臨時文件,用來傳遞數據。

Mitchell個人猜測之所以用這種方法來傳遞,是因為前后兩個不屬於同一個進程,因此需要用共享文件的方式來傳遞資料(這么說其實管道也應該有同樣的文件?)。網上有人說這個只是共享文件而已,但是經過測試,發現雖然有/dev/fd/63這樣的文件產生,但是這個文件其實是指向pipe:[43434]這樣的通道的鏈接。

35. << 雙小於號 后繼內容重定向到左側命令的輸入

雙小於號(here-document [double less then marks] 雙小於標記 )。

Here Document 說明

Here Document也被稱為here-document/here-text/heredoc/hereis/here-string/here-script,在Linux/Unix中的shell中被廣泛地應用,尤其在於用於傳入多行分割參數給執行命令。

除了shell(包含sh/csh/tcsh/ksh/bash/zsh等),這種方式的功能也影響和很多其他語言諸如Perl,PHP以及Ruby等。

這個也被稱為Here-document,用來將后繼的內容重定向到左側命令的stdin中。

<<可以節省格式化時間,別且使命令執行的處理更容易。

在實作的時候只需要輸入<<和終止標志符,而后(一般是回車后)你就可以輸入任何內容,只要在最后的新行中輸入終止標志符,即可完成數據的導入。

Here Document 使用限制

1.分割串常見的為EOF,但不一定固定為EOF,可以使用開發者自行定義的,比如EAOF;2.缺省方式下第一個分割串(EOF)前后均可有空格或者tab,運行時會自動剔除,不會造成影響;(未必,曾經遇到過起始EOF后不可以有空格問題);3.缺省方式下第二個分割串(EOF)必須頂格寫,前后均不可有空格或者tab;

使用here-document的時候,你可以保留空格,換行等。

<<- 與 << 的區別

如果要讓shell腳本更整潔一點,可以在<<和終止符之間放上一個連字符(-);

這樣,

1.結束行的EOF字符前,就可以有空格或者tab鍵了(這里有疑問,這條解釋經驗證可能是錯的).

2.使用<<-代替<<唯一的作用在與分割串所擴起來的內容,頂格的tab會被刪除,用於ident。

示例1:

chenxin@yunwei-01:~/1tmp$ cat -A 1.sh #!/bin/bash$$date_tmp=`date +%s`$$cat <<- 'EOF'                     $ echo hello1$  echo hello2$    echo hello$    echo $date_tmp$EOF$$echo $date_tmp$chenxin@yunwei-01:~/1tmp$ ./1.sh  echo hello1  echo hello2    echo hello    echo $date_tmp1645672402

示例2:

cat > env-build-2.sh <<- "EOF"#!/bin/bashecho "--- docker tag and push ---"docker_image_id=$( docker images |grep $AIC_BUILD_NUMBER |grep "^android" |awk '{print $3}' ) || ( echo "cant find docker images for android" && exit 1 )docker tag "$docker_image_id" 11.122.132.129:80/aic/android:"$AIC_BUILD_NUMBER"-"$lunch_choice"echo "--- Clean up related containers ---"docker container ps -a|grep -E 'android:eng|aic-manager:eng' |grep 'Created' |awk '{print $1}'|xargs docker container rmEOF說明:上面第一個EOF的雙引號,是防止文件中的$符號被轉移為變量值后注入到xxx.sh文件中.

36. <<< 3個小於號

三個小於號(here-strings)。

Here-字串和Here-document類似,here-strings語法:

command [args] <<<["]$word["];$word會展開並作為command的stdin。

<<< 就是將后面的內容作為前面命令的標准輸入

grep a <<< "$VARIABLE" 意思就是在VARIABLE這個變量值里查找字符a

示例

chenxin@yunwei-01:~$ aaa='this is bbb'chenxin@yunwei-01:~$ grep bbb <<< $aaathis is bbbchenxin@yunwei-01:~$ grep bbb << $aaa  #兩個就不行> ;> <> ^C

37. >, < 什么意思?

小於,大於號(ASCII Comparison)。

ASCII比較,進行的是變量的ASCII比較,字串?數字?呃...這個...不就是ASCII比較么?

38. <...> 用於標記單詞的分界

詞界符(word boundary)。

這個是用在正則表達式中的一個特殊分隔符,用來標記單詞的分界。

比如:

the會匹配there,another,them等等,如果僅僅要匹配the,就可以使用這個詞界符,<the>就只能匹配the了。

39. | 管道

管道(pipe)。

管道是Linux,Unix都有的概念,是非常基礎,也是非常重要的一個概念。

它的作用是將管道前(左邊)的命令產生的輸出(stdout)作為管道后(右邊)的命令的輸入(stdin)。

如:ls | wc l,使用管道就可以將命令連接在一起。

注意:

管道是每一個進程的標准輸出都會作為下一個命令的標准輸入,期間的標准輸出不能跨越管道作為后繼命令的標准輸入,

如: cat filename | ls -al | sort 。

想想這個的輸出? 同時,管道是以子進程來運行的,所以管道並不能引起變量改變。

40. >| 強制重定向

強制重定向(force redirection)。

這會強制重寫已經存在的文件。

41. & 與

與號(Run job in background[ampersand])。

如果命令后面跟上一個&符號,這個命令將會在后台運行。

有的時候,腳本中在一條在后台運行的命令可能會引起腳本掛起,等待輸入,出現這種情況可以在原有的腳本后面使用wait命令來修復。

42. &&,|| 邏輯操作符

邏輯操作符(logical operator)。

在測試結構中,可以用這兩個操作符來進行連接兩個邏輯值。

||是當測試條件有一個為真時返回0(真),全假為假;

&&是當測試條件兩個都為真時返回真(0),有假為假。

43. - 減號

減號,連字符(Hyphen/minus/dash)。

\1. 作為選項,前綴[option, prefix]使用。用於命令或者過濾器的選項標志;操作符的前綴。如:

## COMMAND -[選項列表]ls -alsort -dfu $fileset -- $variable if [ $file -ot $file2 ]then    echo "$file is older than $file2."fi

\2. 用於stdin或者stdout的重定向的源或目的[dash].

在tar沒有bunzip2的程序補丁時,我們可以這樣: bunzip2 linux-2.6.13.tar.bz2 | tar xvf - 。將前面解壓的數據作為tar的標准輸入(這里使用一個-表示)

注意:在實作的時候,如果文件名是以[-]開頭的,那么在加上這個作為定向操作符的時候,可能會出錯,此時應該為文件加上合適的前綴路徑,以避免這種情況發生,同樣的,在echo變量的時候,如果變量是以[-]開始,那么可能也會產生意想不到的結果,為了保險起見,可以使用雙引號引用標量:

var="-n"echo $var## 試試看有什么輸出?

還有,這種表示方法不是Bash內建的,要達到此點的這種效果,需要看你使用的軟件是否支持這種操作;

\3. 表示先前的工作目錄(previous working directory),因此,如果你cd到其他目錄下要放回前一個路徑的時候,可以使用cd -來達到目的,其實,這里的[-]使用的是環境變量的$OLDPWD,注意:這里的[-]和前一點是不同的;

\4. 減號或者負號,用在算術操作中。

43. -- 雙減號

shell中的 -- 含義 (兩個橫線的含義)

兩個橫線代表選項的結束,兩個橫線后面的部分都會被認為是參數了,而不再是前面的命令的選項了。

[admin@ip-10-0-1-23 ~]$ echo -- -e hello

-- -e hello

[admin@ip-10-0-1-23 ~]$ echo -e hello

hello

echo -- -e hello和echo -e hello是不一樣的,前者-e是一個普通參數,后者-e則是echo的一個選項.

在你的這個場合下,set -- mysqld表示重設腳本的參數為mysqld,會影響到$argv變量和$1,$#等和參數有關的變量(-- 表示將任何剩余的參數分配給位置參數, 如果沒有剩余的參數, 就會將位置參數復位).

-- 代表后面的字符不是set命令的選項( 比如 set -- "$@" "-h",表示用set指令將參數追加一個-h).

Chanix-LGdeMacBook-Pro:shell_test chanix$ echo $@

Chanix-LGdeMacBook-Pro:shell_test chanix$ set -- "$@" "-h"

Chanix-LGdeMacBook-Pro:shell_test chanix$ echo $@

-h

44. = 等號

等號(Equals)。

\1. 賦值操作,給變量賦值,在等號兩側禁止有空格;

\2. 在比較測試中作為比較符出現,這里要注意,如果在[]中括號中作為比較出現,需要有空格符在等號左右兩側,如 [ $a==$b ]。

45. + 加號

加號(Plus)。

\1. 算術操作符,表示加法;

\2. 在正則表達式中,表示的是其前的這個匹配規則匹配最少一次;

3.在命令或過濾器中作為選項標記,在某些命令或者內置命令中使用+來啟用某些選項,使用-來禁止;

\4. 在參數替換(parameter substitution)中,+前綴表示替代值(當變量為空的時候,使用+后面的值)

56. % 百分號-求模/模式匹配

百分號(modulo[percent sign])。

1.在算術運算中,這個是求模操作符,即兩個數進行除法運算后的余數;

2.在參數替換(parameter substitution)中,可以作為模式匹配。例子:

p=b*9var="abcd12345abc479"echo ${var%p}, ${var%%p}##從右邊開始查找(想想從左是那個符號?)##任何在b和9之間的內容(含)##第一個是找到最短的符合匹配項##后一個是找最大符合的匹配項(貪婪匹配?)#經測試,以上說法不對呢...chenxin@yunwei-01:~$ p=b*9chenxin@yunwei-01:~$ var="abcd12345abc479"chenxin@yunwei-01:~$ echo ${var%p}, ${var%%p}abcd12345abc479, abcd12345abc479

57. ~ 波浪號

波浪號(Home directory[tilde])。

這個和內部變量$HOME是一樣的。

默認表示當前用戶的家目錄(主目錄),這個和~/效果一致,如果波浪號后面跟用戶名,表示是該用戶的家目錄。

58. ~+ 同$PWD

當前的工作目錄(current working directory)。

這個和內置變量$PWD一樣。

chenxin@yunwei-01:~$ echo ~+/home/chenxinchenxin@yunwei-01:~$ pwd/home/chenxinchenxin@yunwei-01:~$ echo $pwdchenxin@yunwei-01:~$ echo $PWD/home/chenxin

59. ~-

前一個工作目錄(previous working directory)。

這個和內部變量$OLDPWD一致,之前的[-]也一樣。

經測試,以上說法並不符...

chenxin@yunwei-01:~$ echo ~-
~-
chenxin@yunwei-01:~$ echo $OLDPWD

chenxin@yunwei-01:~$ 

60. =~ 在[[]]中匹配

Bash 版本3中有介紹,這個是正則表達式匹配。可用在[[]]測試中,比如:

var="this is a test message."
[[ "$var" =~ tf*message ]] && echo "Sir. Found that." || echo "Sorry Sir. No match be found."
##你可以修改中間的正則表達式匹配項,正則表達式可以但不一定需要使用雙引號括起來。


chenxin@yunwei-01:~$ var="this is a test message."
chenxin@yunwei-01:~$ [[ "$var" =~ tf*message ]] && echo "Sir. Found that." || echo "Sorry Sir. No match be found."
Sorry Sir. No match be found.

chenxin@yunwei-01:~$ [[ "$var" =~ t*message ]] && echo "Sir. Found that." || echo "Sorry Sir. No match be found."
Sir. Found that.

chenxin@yunwei-01:~$ [[ "$var" =~ th*message ]] && echo "Sir. Found that." || echo "Sorry Sir. No match be found."
Sorry Sir. No match be found.

chenxin@yunwei-01:~$ [[ "$var" =~ th*message ]] && echo "Sir. Found that." || echo "Sorry Sir. No match be found."
Sorry Sir. No match be found.

chenxin@yunwei-01:~$ [[ "$var" =~ th.*message ]] && echo "Sir. Found that." || echo "Sorry Sir. No match be found."
Sir. Found that.

61. ^ 脫字符

脫字符(caret)。

\1. 在正則表達式中,作為一行的行首(beginning-of-line)位置標志符;

\2. 在參數替換(Parameter substitution)中,這個用法有兩種,

一個脫字符(${var^}),表示第一個字母大寫.

兩個脫字符(${var^^}),表示全部大寫的意思(Bash version >=4)。

示例

chenxin@yunwei-01:~$ var="this is a test message."

chenxin@yunwei-01:~$ echo ${var^}
This is a test message.

chenxin@yunwei-01:~$ echo ${var^^}
THIS IS A TEST MESSAGE.

chenxin@yunwei-01:~$ echo ${var}
this is a test message.

62. 空白-空格/tab/空行

空白符(Whitespace)。

空白符不僅僅是指空格(spaces),還包括制表符(tabs),空行(blank lines),或者這幾種的組合。

可用做函數的分隔符,分隔命令或變量.

空行不會影響腳本的行為,因此可以用它來規划腳本代碼,以增加可讀性,在內置的特殊變量$IFS可以用來針對某些命令進行輸入的參數進行分割,其默認就是空白符。

在字符串或變量中如果有空白符,可以使用引號來規避可能的錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM