標籤:bash shell 特殊字元
什麼是Bash Shell中的特殊字元?某些特殊字元在Bash Shell裡不是表示其字元含義本身,而是另有含義,稱為:meta-meaning。
代表注釋,如果有一行以#開始,那麼意味著這行不會被執行,只是一行說明注釋。
例如:
# this is comments
這是一行注釋。
但是這裡有個例外,那就是指令碼的第一行我們經常看到的:
#!/bin/bash
這個指示一個指令碼的解譯器,說明這個指令碼是由/bin/bash 來解釋的。
從#為開始,後面的字元即為注釋,直到該行結束。體會下面幾個例子:
echo "The # here does not begin a comment."echo ‘The # here does not begin a comment.‘
引用內的字元按原意輸出。
echo The \# here does not begin a comment.
這個使用了\把#做了轉義,即把#原樣輸出。
echo The # here begins a comment.
這個慘了,被截斷了,只輸出: The
echo ${PATH#*:}
這個是參數替換,不是注釋符。
echo $(( 2#101011 ))
這個是基數指示符,也不是注釋符,說明後面的數是二進位的。
分號[semicolon],作為命令的分割符,說明一條命令到此結束。使用分號,你可以在一行寫多條命令,這個我們經常見。
例如:
hdfeel$ echo hello; echo world;helloworldhdfeel$
3.字元:;;
兩個分號在一起[double semicolon],這個只用在case語句裡:
case "$variable" in abc) echo "\$variable = abc" ;; xyz) echo "\$variable = xyz" ;;esac
雙引號[double quote]表示部分引用[partial quoting],多數情況下,雙引號內的字元原樣輸出,但其中的變數會被替換。比如:
hdfeel$ fileName="a.txt"hdfeel$ echo "the file name is $fileName"hdfeel$ the file name is a.txt
這可能正是我們需要的。如果你想原樣輸出,那麼用單引號,或者使用反斜線\對$進行轉義。
echo "the file name is \$fileName"echo ‘the file name is $fileName‘
單引號[single quote],代表全引用[full quoting],引號內的字元全部原樣輸出,即使有變數也不做相應的替換。
例子上面有了,不再重複了。
逗號[comma operator],串連2個算式,但是只有最後一個算式的值被返回。
hdfeel$ let "t2 = ((a = 9, 15 / 3))"
上面的語句把a賦值為9,並把15除以3的結果5,賦值給t2.
另外,逗號操作符,也可以連接字串:
for file in /{,usr/}bin/*calc# ^ 在/bin和/usr/bin目錄裡,找出所有以"calc"結尾的可執行檔#+ do if [ -x "$file" ] then echo $file fidone# /bin/ipcalc# /usr/bin/kcalc# /usr/bin/oidcalc# /usr/bin/oocalc
反斜線[backslash]就是換碼符[escape],為單個字元的引用機制,通過對字元的引用來改變它本來的含義。
比如:
hdfeel$ echo "\""; // 輸出雙引號hdfeel$ "hdfeel$ x=abchdfeel$ echo “$x” // 輸出變數的值hdfeel$ abchdfeel$ echo “\$x” // 原樣輸出hdfeel$ $x
命令替換符,就是鍵盤的左上方波浪符下面的字元,不要看錯了,不是單引號噢,<code>`</code>中間放一個可執行檔命令<code>`</code>,這個符號也叫反引號。
舉個小例子:
#! /bin/bashinFile=“example.txt"maxLen=12#while read line; do len=`echo $line | awk ‘{print length($0)}‘` // 子命令被放到了反引號裡面執行。 if [ $len -lt $maxLen ]; then echo $line fidone < $inFile
上面的程式列印出了少於12個字元的行。
冒號[colon],稱為空白命令[null command],即什麼都不執行,傳回值為true,也就是0,屬於Bash的內建命令。
下面2段代碼把冒號當成了判斷條件:
while :do operation-1 operation-2 ... operation-ndone
和上面的代碼實現一樣的功能
while truedo operation-1 operation-2 ... operation-ndone
有時它也被用來當預留位置:
if conditionthen : # Do nothing and branch aheadelse # Or else ... take-some-actionfi
冒號:也用來當作域分隔字元,你在/etc/passwd和$PATH變數中可以看到它:
shells hdfeel$ echo $PATH/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbinshells hdfeel$
最糟心的時,冒號這東西還可以做函數名,如果想讓代碼把人搞暈的話,這麼搞
:(){ echo "The name of this function is "$FUNCNAME" " # Why use a colon as a function name? # It‘s a way of obfuscating your code.}:# The name of this function is :
當然在函數內部,它可以做一個預留位置,這樣函數就不是一個空函數了。
not_empty (){ :} # Contains a : (null command), and so is not empty.
下面的這個比較實用:
{a..z} 產生字元a到z之間的所有字元,當然也可以是數字,比如:{1..9}
體會下這個代碼
echo {a..z} # a b c d e f g h i j k l m n o p q r s t u v w x y z# Echoes characters between a and z.echo {0..3} # 0 1 2 3# Echoes characters between 0 and 3.base64_charset=( {A..Z} {a..z} {0..9} + / = )# Initializing an array, using extended brace expansion.# From vladz‘s "base64.sh" example script.
上面解釋了一些Bash Shell中的部分特殊字元,在<a Advanced Bash-Scripting Guide中有更多、更詳細的介紹,有興趣可以參考。
原文:http://www.hdfeel.net/2015/01/bash-shell-special-character/
本文出自 “HDFeel的IT視點” 部落格,請務必保留此出處http://hdfeel.blog.51cto.com/9805995/1606620
Bash Shell 中的特殊字元