# 井號(comments)
井號 出現在一行的開頭,或者位於完整指令之後,這類情況表示符號後面的是註解文字,不會被執行。
#這個井號表示註釋
echo "abc" #這個井號表示註釋
如果被用在指令中,或者引號雙引號括住的話,或者在倒斜線的後面,那他就變成一般符號,不具上述的特殊功能。
echo "abc#abc"
~ 波浪號
波浪號 代表當前登錄用戶的home目錄。
cd ~
~+ 表示當前的工作目錄,和pwd作用相同。
echo ~+
~- 表示上次的工作目錄。
echo ~-
; 分號(command seperator)
分號表示連續指令。
cd ~; ls
;; 連續分號(terminator)
連續分號 專用在case的選項,作爲結束標識。
var="1"
case $var in
1)
echo 1;
;;
2)
echo 2;
;;
*)
echo "default";
;;
esac
. 點號(dot)
1個點號表示當前目錄,2個點號表示上層目錄。
ls .
ls ..
如果文件名以點號開頭,表示該文件爲隱藏屬性。需要通過 ls -a 才能看到該文件。
正則表達式中,點號表示任意字符。
’ 單引號(single quote)
被單引號用括住的內容,將被視爲單一字串。在引號內的代表變數的$符號,沒有作用,也就是說,他被視爲一般符號處理,防止任何變量替換。
var=123
echo 'number is $var' #這裏輸出的爲$var,而不是123
” 雙引號(double quote)
被雙引號用括住的內容,將被視爲單一字串。它防止通配符擴展,但允許變量擴展。這點與單引數的處理方式不同。
var=123
echo 'number is $var' #這裏輸出的爲123
` 倒引號(backticks)
倒引號引住的內容爲命令,會作爲命令執行。類似於$()
echo `ls`
echo $(ls)
, 逗號(comma)
逗號用在運算表達式中間,用於分隔表達式。
a=1
b=2
((a++, b++))
echo $a
echo $b
/ 斜線(forward slash)
斜線在路徑表示時,代表目錄。
cd /etc/sysconfig/
通常單一的斜線表示系統根目錄。
ls /
在四則運算中,表示除法。
let "var=25/5"
echo $var #輸出5
\ 反斜槓
反斜槓放在指令前,表示取消alias作用。
\ls
反斜槓房子特殊符號前,則該特殊符號的作用消失,表示轉義
echo "\"abc\""
反斜槓放在指令的末端,表示指令鏈接下一行。
ls /etc/ \
-la
| 豎線(pipeline)
unix系統中,豎線表示管道,連接上個指令的標準輸出,作爲下個指令的標準輸入。
ls -la | wc -l
! 感嘆號(negate or reverse)
感嘆號通常表示反邏輯的作用,如:條件語句中,表示 不等於
if [ $var != 2 ]; then
echo "not equal"
fi
在正則表達式中,表示反邏輯。
ls a[!0-9]
: 冒號
冒號在bash中,這是一個內建指令,表示:什麼都不做,但返回值爲0
:
echo $? #返回0
? 問號
問號在文件名擴展上,表示任意單個字符,但不包括null字符。
ls a?a
* 星號
星號在文件名擴展上,表示任意多個字符,包括null字符。
ls a*
星號在運算時,代表乘法。
let "var = 3 * 4"
echo $var #12
兩個星號在運算時代表次方運算。
let "var=2**3"
echo $var #8
$ 美元符號(dollar sign)
美元符號表示變量替換。
var=3
echo $var
正則表達式中,美元符號表示行結束符。
{} 定義了不少用法。以下是取自線上說明
${parameter:-word} 使用默認值word來代替那些空的或者沒有複製的變量。
${parameter:=word} 使用指定值word來代替空的或者沒有複製的變量。
${parameter:?word} 如果變量爲空或者未賦值,那麼就會顯示出錯誤信息word並中止腳本的執行同時返回退出碼1。
${parameter:+word}
${parameterffset}
${parameterffset:length}
${!prefix*}
${#parameter} 字符串長度
${parameter#word} 從字符串的頭部開始刪除與word匹配的最小部分,然後返回剩餘部分
${parameter##word} 從字符串的頭部開始刪除與word匹配的最長部分,然後返回剩餘部分
${parameter%word} 從字符串的尾部開始刪除與word匹配的最小部分,然後返回剩餘部分
${parameter%%word} 從字符串的尾部開始刪除與word匹配的最長部分,然後返回剩餘部分
${parameter/pattern/string}
${parameter//pattern/string}
0, 2, ..., {11}, …
其中: 1, … 表示腳本參數。
* 具有相同作用。
不同點是:
@ 則仍保留每個引用變量的區段概念。
$# 也是與引用變量相關的符號,表示引用變量的數量。
$? 狀態值(status variable)
表示指令的結果碼,一般來說:0表示正常,非0表示異常。
$$ 表示當前進程的pid
$- 顯示shell使用的當前選項
$! 最後一個後臺運行的進程ID
() 圓括號(指令羣組,command group)
用括號將一串連續指令括起來,這種用法對 shell 來說,稱爲指令羣組。
(cd ~ ; vcgh=`pwd` ;echo $vcgh)
指令羣組有一個特性,shell會以產生 subshell來執行這組指令。因此,在其中所定義的變數,僅作用於指令羣組本身。
除了上述的指令羣組,括號也用在 array 變數的定義上;另外也應用在其他可能需要加上escape字元才能使用的場合,如運算式。
(()) 雙圓括號
這組符號的作用與 let 指令相似,用在算數運算上,是 bash 的內建功能。所以,在執行效率上會比使用 let指令要好許多。
var=1
((++var))
echo $var #2
{} 大括號(block of code)
腳本中,大括號中夾雜着一段或幾段以分號做結尾的指令或變量,這種情況下,和指令羣組類似,但不同的是,它在當前shell執行,不會產生subshell。
{
echo abc
}
大括號也被用在函數的功能上,廣義的講,單純只使用大括號時,作用就像是個沒有指定名稱的函數一樣。
此外,大括號還有另一種用法,如下
{xx,yy,zz,…}
這種大括號的組合,常用在字串的組合上,來看個例子
mkdir {userA,userB,userC}-{home,bin,data}
我們得到 userA-home, userA-bin, userA-data, userB-home, userB-bin,userB-data, userC-home, userC-bin,userC-data,這幾個目錄。
[] 中括號
中括號常用在流程控制中,用於括住判斷式。可理解爲指向test命令的一個軟鏈接。所以其用法可以參照test,將test位置替換爲[即可。
if [ -z $var ]; then
fi
正則表達式中,表示範圍或集合。
ls abc[1-9]
[[]] 與[] 作用類似,允許使用|| && 邏輯等符號。
var=5
if [[ $var > 4 ]]; then echo "large"; fi;
|| 雙豎線
雙豎線表示邏輯符號 or,可以鏈接多個命令。允許執行一系列命令直到有一條命令成功爲止,其後所有命令將不再被執行。
&& 雙and符號
雙and符號表示邏輯符號 and,可以連接多個命令。只有在前面所有的命令都執行成功的情況下才執行後一條命令。
echo "a" && echo "b" && echo "c"
& and符號
單一個and符號放在完整指令末端,表示後臺執行。
+ 加號(plus)
在運算表達式中,表示加法。
此外在正則表達式中,用來表示很多個的前面字符的意思。
grep '10\\+9' fileB109100910000910000931010009#這個符號在使用時,前面必須加上轉義字符。
- 減號(dash)
在運算表達式中,表示減號。
let "var=5-3"
減號表示系統指令的選項符號。
ls -la
在GNU指令中,如果單獨使用-,不加任何該加的文件名稱時,代表標準輸入的意思。只是GNU指令的共通選項。
tar xpvf - #代表從標準輸入讀取資料。
cd指令中,表示回到上次目錄。
cd -
% 百分號(modulo)
在運算表達式中,表示取模
expr 10 % 2 #輸出2
此外,也被運用在關於變量的規則表達式當中
${parameter%word}${parameter%%word}
一個 % 表示最短的 word 匹配,兩個表示最長的 word 匹配。
= 等號(equals)
等號表示變量賦值,PATH設定。
var=3
export JAVA_HOME=/usr/local/java
== 雙等號
雙等號在條件表達式中,表示等於。
if [ $var1 == $var2 ]; ...
!= 不等於
不等於號在條件表達式中,表示不等於。
if [ $var1 != $var2 ]; ...
^ 上尖括號
正則表達式中,表示行首,在[]中,表示非。
輸出/輸入重導向
ls >> a.txt #追加操作
ls > a.txt #創建操作
ls 1>>/dev/null 2>>&1