Linux Shell编程(4)——shell特殊字符(上)
生活随笔
收集整理的這篇文章主要介紹了
Linux Shell编程(4)——shell特殊字符(上)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在腳本或其他別的地方出現的特殊字符
#
注釋. 以一個#開頭的行 (#!是例外) 是注釋行.
# 這是一行注釋.
注釋也可以出現在一個命令語句的后面。
echo "A comment will follow." # 這里可以添加注釋.
# ? ? ? ? ? ? ? ? ? ? ? ? ? ?^ 注意在#前面可以有空白符 #
注釋行前面也可以有空白字符.
?#注意這個注釋行的開頭是一個TAB鍵.
在同一行中,命令不會跟在一個注釋的后面。因為這種情況下沒有辦法分辨注釋的結尾,命令只能放在同一行的行首。用另外的一個新行開始下一個注釋。
當然了,在echo命令給出的一個轉義的#字符并不會開始一個注釋。同樣地,出現在一些參數代換結構和在數值常量表達式中的#字符也同樣不會開始一個注釋。
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.
echo ${PATH#*:} ? ? ? # 前面的#是參數代換,不是注釋.
echo $(( 2#101011 )) ?# 基本轉換,不是注釋.
# 多謝, S.C.
標準的引用和轉義 符("'\)可以轉義#。
當然,模式匹配操作也可以使用#,而不必把它當做注釋的開始。
;
命令分割符[分號]. 分割符允許在同一行里有兩個或更多的命令.
echo hello; echo there
if [ -x "$filename" ]; then ? ?# 注意:"if" and "then"需要分隔符
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 思考一下這是為什么?
? echo "File $filename exists."; cp $filename $filename.bak
else
? echo "File $filename not found."; touch $filename
fi; echo "File test complete."
注意”;”有時需要轉義.
;;
case語句分支的結束符[雙分號].
case "$variable" in
abc) ?echo "\$variable = abc" ;;
xyz) ?echo "\$variable = xyz" ;;
esac
.
"點"命令[圓點]. 等同于source (參考例子 11-20).這是一個bash的內建命令.
.
"點", 作為一個文件名的組成部分.當點(.)以一個文件名為前綴時,起作用使該文件變成了隱藏文件。這種隱藏文件ls一般是不會顯示出來的。[譯者注:除非你加了選項-a]
?bash$ touch .hidden-file
? ?
作為目錄名時,單個點(.)表示當前目錄,兩個點(..)表示上一級目錄(譯者注:或稱為父目錄)。
?bash$ pwd
?/home/bozo/projects
?
?bash$ cd .
?bash$ pwd
?/home/bozo/projects
?
?bash$ cd ..
?bash$ pwd
?/home/bozo/
?
單點(.)文件名常常被當作文件移動命令的目的路徑.
?bash$ cp /home/bozo/current_work/junk/* .
?
.
點(.)字符匹配.作為正則表達式的一部分,匹配字符時,單點(.)表示匹配任意一個字符。
"
部分引用[雙引號]. "STRING"的引用會使STRING里的特殊字符能夠被解釋。請參考第五章.
'
完全引用[單引號]. 'STRING'能引用STRING里的所有字符(包括特殊字符也會被原樣引用). 這是一個比使用雙引號(“)更強的引用。 參考第5章.
,
逗號操作符[逗號]. 逗號操作符用于連接一連串的數學表達式。這一串的數學表達式每一個都被求值,但只有最后一個被返回。(譯者注:換句話說,就是整個表達式的值取決于最后一個表達式的值。)
? ?1 let "t2 = ((a = 9, 15 / 3))" ?# Set "a = 9" and "t2 = 15 / 3"
\
轉義符[后斜杠].用于單個字符的引用機制。
\X "轉義"字符為X.它有"引用"X的作用,也等同于直接在單引號里的'X'.\符也可以用于引用雙引號(")和單引號('),這時雙引號和單引號就表示普通的字符,而不是表示引用了。
參考第五章對轉義字符的更深入的解釋。
/
文件路徑的分隔符[前斜杠]. 分隔一個文件路徑的各個部分。(就像/home/bozo/projects/Makefile).
它也是算術操作符中的除法.
`
命令替換.`command` 結構使字符(`)[譯者注:這個字符不是單引號,而是在標準美國鍵盤上的ESC鍵下面,在字符1左邊,在TAB鍵上面的那個鍵,要特別留心]引住的命令(command)執行結果能賦值給一個變量。它也被稱為后引號(backquotes)或是斜引號(backticks).
:
空命令[冒號]. 這個命令意思是空操作(即什么操作也不做). 它一般被認為是和shell的內建命令true是一樣的。冒號":" 命令是Bash自身內建的, and its它的退出狀態碼是真(即0)。[譯者注:shell中真用數字0表示].
:
echo $? ? # 0
死循環可以這么寫:
while :
do
? ?operation-1
? ?operation-2
? ?...
? ?operation-n
done
# 等同于:
# ? ?while true
# ? ?do
# ? ? ?...
# ? ?done
在if/then的測試結構中用作占位符:
if condition
then : ? # 什么也不做的分支
else
? ?take-some-action
fi
在必須要有兩元操作的地方作為一個分隔符, 參考例子 8-2和默認參數.
: ${username=`whoami`}
# ${username=`whoami`} ? 如果沒有開頭的:,將會出錯
# ? ? ? ? ? ? ? ? ? ? ? ?除非"username"是一個外部命令或是內建命令...
在here document中的一個命令作為一個分隔符.
在參數替換中為字符串變量賦值
: ${HOSTNAME?} ${USER?} ${MAIL?}
# ?如果列出的一個或多個基本的環境變量沒有設置,
#+ 將打印出錯信息。
變量擴展/子串代換.
和重定向操作符(>)連用, 可以把一個文件的長度截短為零,文件的權限不變。如果文件不存在,則會創建一個新文件。
: > data.xxx ? # 文件"data.xxx"現在長度為0了
# 作用相同于:cat /dev/null >data.xxx(譯者注:echo >data.xxx也可以)
# 但是,用NULL(:)操作符不會產生一個新的進程,因為NULL操作符是內建的。
請參考例子 12-14.
和添加重定向操作符(>>)連用(: >> target_file).如果目標文件存在則什么也沒有發生,如果目標文件不存在,則創建它。
這只能應用在普通文件中,不能用在管道,符號鏈接和其他的特殊文件。
雖然這是不被推薦的,但是NULL操作符(:)也可以用于開始注釋一行。使用#來注釋一行將會使Bash不會檢查這行后面的語法是否有錯,因此#注釋幾乎可以出現任何的東西。但是,對于用NULL操作符(:)注釋的行則不是這樣。
下面一個會產生錯誤的注釋。
? ?1 : This is a comment that generates an error, ( if [ $x -eq 3] ).
字符”:”也用于域分割符。比如說在/etc/passwd和環境變量$PATH里.
?bash$ echo $PATH
?/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/sbin:/usr/sbin:/usr/games
!
取反一個測試結果或退出狀態[感嘆號]. 取反操作符(!)取反一個命令的退出狀態。它也取反一個測試操作。例如,它能改相等符( = )為不等符( != ).取反操作符(!)是一個Bash的關鍵字.
在不同的環境里,感嘆號也可以出現在間接變量引用.
還有一種環境里,在命令行中,感嘆號(!)調用屬于歷史命令機制的調用(詳細請看附錄 J).值得一提的是,在一個腳本里,命令歷史機制是被禁止的。
*
通配符[星號].星號(*)字符在用于匹配文件名擴展的一個通配符.它自動匹配給定的目錄下的每一個文件。
?bash$ echo *
?abs-book.sgml add-drive.sh agram.sh alias.sh
?
星號(*)也用于正則表達式中匹配任意數字字符。.
*
算術操作符. 在計算時,星號(*)表示乘法運算符。兩個星號(**)表示求冪運算符。
?
測試操作符.在一些表達式中,問號(?)表示一個條件測試.
在雙括號結構里,問號(?)表示C風格的三元操作符.請參考例子 9-30.
在參數替換表達式里,問號(?)測試一個變量是否被設置了值.
?
通配符. 字符?被用于文件名擴展特性的文件名表達式的單字符匹配,同時也在擴展正則表達式中匹配任意一個字符.
$
變量替換 (引用一個變量的內容).
var1=5
var2=23skidoo
echo $var1 ? ? # 5
echo $var2 ? ? # 23skidoo
一個變量名前面加一個$字符前綴表示引用該變量的內容。
$
行的結尾. 在正則表達式里,一個$字符表示匹配一行的結尾。
?
${}
參數替換.
$*, $@
位置參數.
$?
保存退出碼值的變量. 變量$?保存了一個命令,一個函數,或一個腳本的退出狀態碼的值。
$$
進程ID變量. 變量$$保存了腳本運行時的進程ID值。
()
命令組.
? ?1 (a=hello; echo $a)
一組由圓括號括起來的命令是新開一個子shell來執行的.
因為是在子shell里執行,在圓括號里的變量不能被腳本的其他部分訪問。因為父進程(即腳本進程)不能存取子進程(即子shell)創建的變量。
a=123
( a=321; )
echo "a = $a" ? # a = 123
# 在圓括號里的變量"a"實際上是一個局部變量,作用局域只是在圓括號內用于數組始初化
數組初始化.
?Array=(element1 element2 element3)
{xxx,yyy,zzz,...}
擴展支持.
cat {file1,file2,file3} > combined_file
# 連接file1,file2,和file3的內容并寫到文件combined_file里去.
cp file22.{txt,backup}
# 拷貝"file22.txt"內容為"file22.backup"
一個命令可以在文件名擴展中從逗號分隔的各模式來擴展參數列表。 [1] 文件名將會依照列表中逗號分隔開的模式匹配擴展。
#
注釋. 以一個#開頭的行 (#!是例外) 是注釋行.
# 這是一行注釋.
注釋也可以出現在一個命令語句的后面。
echo "A comment will follow." # 這里可以添加注釋.
# ? ? ? ? ? ? ? ? ? ? ? ? ? ?^ 注意在#前面可以有空白符 #
注釋行前面也可以有空白字符.
?#注意這個注釋行的開頭是一個TAB鍵.
在同一行中,命令不會跟在一個注釋的后面。因為這種情況下沒有辦法分辨注釋的結尾,命令只能放在同一行的行首。用另外的一個新行開始下一個注釋。
當然了,在echo命令給出的一個轉義的#字符并不會開始一個注釋。同樣地,出現在一些參數代換結構和在數值常量表達式中的#字符也同樣不會開始一個注釋。
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.
echo ${PATH#*:} ? ? ? # 前面的#是參數代換,不是注釋.
echo $(( 2#101011 )) ?# 基本轉換,不是注釋.
# 多謝, S.C.
標準的引用和轉義 符("'\)可以轉義#。
當然,模式匹配操作也可以使用#,而不必把它當做注釋的開始。
;
命令分割符[分號]. 分割符允許在同一行里有兩個或更多的命令.
echo hello; echo there
if [ -x "$filename" ]; then ? ?# 注意:"if" and "then"需要分隔符
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 思考一下這是為什么?
? echo "File $filename exists."; cp $filename $filename.bak
else
? echo "File $filename not found."; touch $filename
fi; echo "File test complete."
注意”;”有時需要轉義.
;;
case語句分支的結束符[雙分號].
case "$variable" in
abc) ?echo "\$variable = abc" ;;
xyz) ?echo "\$variable = xyz" ;;
esac
.
"點"命令[圓點]. 等同于source (參考例子 11-20).這是一個bash的內建命令.
.
"點", 作為一個文件名的組成部分.當點(.)以一個文件名為前綴時,起作用使該文件變成了隱藏文件。這種隱藏文件ls一般是不會顯示出來的。[譯者注:除非你加了選項-a]
?bash$ touch .hidden-file
? ?
作為目錄名時,單個點(.)表示當前目錄,兩個點(..)表示上一級目錄(譯者注:或稱為父目錄)。
?bash$ pwd
?/home/bozo/projects
?
?bash$ cd .
?bash$ pwd
?/home/bozo/projects
?
?bash$ cd ..
?bash$ pwd
?/home/bozo/
?
單點(.)文件名常常被當作文件移動命令的目的路徑.
?bash$ cp /home/bozo/current_work/junk/* .
?
.
點(.)字符匹配.作為正則表達式的一部分,匹配字符時,單點(.)表示匹配任意一個字符。
"
部分引用[雙引號]. "STRING"的引用會使STRING里的特殊字符能夠被解釋。請參考第五章.
'
完全引用[單引號]. 'STRING'能引用STRING里的所有字符(包括特殊字符也會被原樣引用). 這是一個比使用雙引號(“)更強的引用。 參考第5章.
,
逗號操作符[逗號]. 逗號操作符用于連接一連串的數學表達式。這一串的數學表達式每一個都被求值,但只有最后一個被返回。(譯者注:換句話說,就是整個表達式的值取決于最后一個表達式的值。)
? ?1 let "t2 = ((a = 9, 15 / 3))" ?# Set "a = 9" and "t2 = 15 / 3"
\
轉義符[后斜杠].用于單個字符的引用機制。
\X "轉義"字符為X.它有"引用"X的作用,也等同于直接在單引號里的'X'.\符也可以用于引用雙引號(")和單引號('),這時雙引號和單引號就表示普通的字符,而不是表示引用了。
參考第五章對轉義字符的更深入的解釋。
/
文件路徑的分隔符[前斜杠]. 分隔一個文件路徑的各個部分。(就像/home/bozo/projects/Makefile).
它也是算術操作符中的除法.
`
命令替換.`command` 結構使字符(`)[譯者注:這個字符不是單引號,而是在標準美國鍵盤上的ESC鍵下面,在字符1左邊,在TAB鍵上面的那個鍵,要特別留心]引住的命令(command)執行結果能賦值給一個變量。它也被稱為后引號(backquotes)或是斜引號(backticks).
:
空命令[冒號]. 這個命令意思是空操作(即什么操作也不做). 它一般被認為是和shell的內建命令true是一樣的。冒號":" 命令是Bash自身內建的, and its它的退出狀態碼是真(即0)。[譯者注:shell中真用數字0表示].
:
echo $? ? # 0
死循環可以這么寫:
while :
do
? ?operation-1
? ?operation-2
? ?...
? ?operation-n
done
# 等同于:
# ? ?while true
# ? ?do
# ? ? ?...
# ? ?done
在if/then的測試結構中用作占位符:
if condition
then : ? # 什么也不做的分支
else
? ?take-some-action
fi
在必須要有兩元操作的地方作為一個分隔符, 參考例子 8-2和默認參數.
: ${username=`whoami`}
# ${username=`whoami`} ? 如果沒有開頭的:,將會出錯
# ? ? ? ? ? ? ? ? ? ? ? ?除非"username"是一個外部命令或是內建命令...
在here document中的一個命令作為一個分隔符.
在參數替換中為字符串變量賦值
: ${HOSTNAME?} ${USER?} ${MAIL?}
# ?如果列出的一個或多個基本的環境變量沒有設置,
#+ 將打印出錯信息。
變量擴展/子串代換.
和重定向操作符(>)連用, 可以把一個文件的長度截短為零,文件的權限不變。如果文件不存在,則會創建一個新文件。
: > data.xxx ? # 文件"data.xxx"現在長度為0了
# 作用相同于:cat /dev/null >data.xxx(譯者注:echo >data.xxx也可以)
# 但是,用NULL(:)操作符不會產生一個新的進程,因為NULL操作符是內建的。
請參考例子 12-14.
和添加重定向操作符(>>)連用(: >> target_file).如果目標文件存在則什么也沒有發生,如果目標文件不存在,則創建它。
這只能應用在普通文件中,不能用在管道,符號鏈接和其他的特殊文件。
雖然這是不被推薦的,但是NULL操作符(:)也可以用于開始注釋一行。使用#來注釋一行將會使Bash不會檢查這行后面的語法是否有錯,因此#注釋幾乎可以出現任何的東西。但是,對于用NULL操作符(:)注釋的行則不是這樣。
下面一個會產生錯誤的注釋。
? ?1 : This is a comment that generates an error, ( if [ $x -eq 3] ).
字符”:”也用于域分割符。比如說在/etc/passwd和環境變量$PATH里.
?bash$ echo $PATH
?/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/sbin:/usr/sbin:/usr/games
!
取反一個測試結果或退出狀態[感嘆號]. 取反操作符(!)取反一個命令的退出狀態。它也取反一個測試操作。例如,它能改相等符( = )為不等符( != ).取反操作符(!)是一個Bash的關鍵字.
在不同的環境里,感嘆號也可以出現在間接變量引用.
還有一種環境里,在命令行中,感嘆號(!)調用屬于歷史命令機制的調用(詳細請看附錄 J).值得一提的是,在一個腳本里,命令歷史機制是被禁止的。
*
通配符[星號].星號(*)字符在用于匹配文件名擴展的一個通配符.它自動匹配給定的目錄下的每一個文件。
?bash$ echo *
?abs-book.sgml add-drive.sh agram.sh alias.sh
?
星號(*)也用于正則表達式中匹配任意數字字符。.
*
算術操作符. 在計算時,星號(*)表示乘法運算符。兩個星號(**)表示求冪運算符。
?
測試操作符.在一些表達式中,問號(?)表示一個條件測試.
在雙括號結構里,問號(?)表示C風格的三元操作符.請參考例子 9-30.
在參數替換表達式里,問號(?)測試一個變量是否被設置了值.
?
通配符. 字符?被用于文件名擴展特性的文件名表達式的單字符匹配,同時也在擴展正則表達式中匹配任意一個字符.
$
變量替換 (引用一個變量的內容).
var1=5
var2=23skidoo
echo $var1 ? ? # 5
echo $var2 ? ? # 23skidoo
一個變量名前面加一個$字符前綴表示引用該變量的內容。
$
行的結尾. 在正則表達式里,一個$字符表示匹配一行的結尾。
?
${}
參數替換.
$*, $@
位置參數.
$?
保存退出碼值的變量. 變量$?保存了一個命令,一個函數,或一個腳本的退出狀態碼的值。
$$
進程ID變量. 變量$$保存了腳本運行時的進程ID值。
()
命令組.
? ?1 (a=hello; echo $a)
一組由圓括號括起來的命令是新開一個子shell來執行的.
因為是在子shell里執行,在圓括號里的變量不能被腳本的其他部分訪問。因為父進程(即腳本進程)不能存取子進程(即子shell)創建的變量。
a=123
( a=321; )
echo "a = $a" ? # a = 123
# 在圓括號里的變量"a"實際上是一個局部變量,作用局域只是在圓括號內用于數組始初化
數組初始化.
?Array=(element1 element2 element3)
{xxx,yyy,zzz,...}
擴展支持.
cat {file1,file2,file3} > combined_file
# 連接file1,file2,和file3的內容并寫到文件combined_file里去.
cp file22.{txt,backup}
# 拷貝"file22.txt"內容為"file22.backup"
一個命令可以在文件名擴展中從逗號分隔的各模式來擴展參數列表。 [1] 文件名將會依照列表中逗號分隔開的模式匹配擴展。
轉載于:https://www.cnblogs.com/new0801/p/6176876.html
總結
以上是生活随笔為你收集整理的Linux Shell编程(4)——shell特殊字符(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu12.04 安装中文输入法
- 下一篇: 学习NodeJS第一天:node.js引