# ; ;; . , / / 『string'| ! $ ${} $? $$ $* 「string」* ** ? : ^ $# $@ `command`{} () (()) || && ~ ~+ ~- & / + – %= == !=
輸入輸出重導向
> >> < << : > &> 2&> 2<>>& >&2
# 井號 (comments)
這幾乎是個滿場都有的符號。
#!/bin/bash
井號也常出現在一行的開頭,或者位於完整指令之後,這類情況表示符號後面的是註解文字,不會被執行。
# this line is comments.
echo 「a = $a」 # a = 0
由於這個特性,當臨時不想執行某行指令時,只需在該行開頭加上 # 就行了。這常用在撰寫過程中。
#echo 「a = $a」 # a = 0
如果被用在指令中,或者引號雙引號括住的話,或者在倒斜線的後面,那他就變成一般符號,不具上述的特殊功能。
~ 帳戶的 home 目錄
算是個常見的符號,代表使用者的 home 目錄:cd ~;
也可以直接在符號後加上某帳戶的名稱:cd ~user 或者當成是路徑的一部份:~/bin;
~+ 當前的工作目錄,這個符號代表當前的工作目錄,她和內建指令 pwd(print working directory 在linux層次結構中,想要知道當前所處的目錄,可以用pwd
命令,該命令顯示整個路徑名。) 的作用是相同的。
# echo ~+/var/log
~- 上次的工作目錄,這個符號代表上次的工作目錄。
; 分號 (command separator)
在 shell 中,擔任」連續指令」功能的符號就是」分號」。譬如以下的例子:cd ~/backup ; mkdir startup ; cp ~/.* startup/.
;; 連續分號 (terminator)
專用在 case 的選項,擔任 terminator 的角色。
case 「$fop」 inhelp) echo 「usage: command -help -version filename」 ;;version) echo 「version 0.1″ ;;esac
. 逗號 (dot)
在 shell 中,使用者應該都清楚,乙個 dot 代表當前目錄,兩個 dot 代表上層目錄。
cdpath=.:~:/home:/home/web:/var:/usr/local
在上行 cdpath 的設定中,等號後的 dot 代表的就是當前目錄的意思。
如果檔名稱以 dot 開頭,該檔案就屬特殊檔案,用 ls 指令必須加上 -a 選項才會顯示。除此之外,在 regular expression 中,乙個 dot 代表匹配乙個字元。
『string' 單引號 (single quote)
被單引號用括住的內容,將被視為單一字串。在引號內的代表變數的$符號,沒有作用,也就是說,他被視為一般符號處理,防止任何變數替換。
heyyou=homeecho 『$heyyou' # we get $heyyou
「string」 雙引號 (double quote)
被雙引號用括住的內容,將被視為單一字串。它防止萬用字元擴充套件,但允許變數擴充套件。這點與單引數的處理方式不同。
heyyou=homeecho 「$heyyou」 # we get home
`command` 倒引號 (backticks)
在前面的單雙引號,括住的是字串,但如果該字串是一列命令列,會怎樣?答案是不會執行。要處理這種情況,我們得用倒單引號來做。
fdv=`date +%f`echo 「today $fdv」
在倒引號內的 date +%f 會被視為指令,執行的結果會帶入 fdv 變數中。
, 逗點 (comma)
這個符號常運用在運算當中當做」區隔」用途。如下例
#!/bin/bashlet 「t1 = ((a = 5 + 3, b = 7 – 1, c = 15 / 3))」echo 「t1 = $t1, a = $a, b = $b」
/ 斜線 (forward slash)
在路徑表示時,代表目錄。
cd /etc/rc.dcd ../..cd /
通常單一的 / 代表 root 根目錄的意思;在四則運算中,代表除法的符號。
let 「num1 = ((a = 10 / 2, b = 25 / 5))」
\ 倒斜線 (escape)
在互動模式下的escape 字元,有幾個作用;放在指令前,有取消 aliases 的作用;放在特殊符號前,則該特殊符號的作用消失;放在指令的最末端,表示指令連線下一行。
# type rm
rm is aliased to `rm -i'
# \rm .\*.log
上例,我在 rm 指令前加上 escape 字元,作用是暫時取消別名的功能,將 rm 指令還原。
# bkdir=/home
# echo 「backup dir, \$bkdir = $bkdir」
backup dir, $bkdir = /home
上例 echo 內的 \$bkdir,escape 將 $ 變數的功能取消了,因此,會輸出 $bkdir,而第二個 $bkdir 則會輸出變數的內容 /home。
| 管道 (pipeline)
pipeline 是 unix 系統,基礎且重要的觀念。鏈結上個指令的標準輸出,做為下個指令的標準輸入。
who | wc -l
善用這個觀念,對精簡 script 有相當的幫助。
! 驚嘆號(negate or reverse)
通常它代表反邏輯的作用,譬如條件偵測中,用 != 來代表」不等於」
if [ "$?" != 0 ]thenecho 「executes error」exit 1fi
在規則表示式中她擔任 「反邏輯」 的角色
ls a[!0-9]
上例,代表顯示除了a0, a1 …. a9 這幾個檔案的其他檔案。
: 冒號
在 bash 中,這是乙個內建指令:」什麼事都不幹」,但返回狀態值 0。
:echo $? # 回應為 0
: > f.$$
上面這一行,相當於 cat /dev/null > f.$$。不僅寫法簡短了,而且執行效率也好上許多。
有時,也會出現以下這類的用法
: $ $ $
這行的作用是,檢查這些環境變數是否已設定,沒有設定的將會以標準錯誤顯示錯誤訊息。像這種檢查如果使用類似 test 或 if 這類的做法,基本上也可以處理,但都比不上上例的簡潔與效率。
除了上述之外,還有乙個地方必須使用冒號
path=$path:$home/fbin:$home/fperl:/usr/local/mozilla
在使用者自己的home 目錄下的 .bash_profile 或任何功能相似的檔案中,設定關於」路徑」的場合中,我們都使用冒號,來做區隔。
? 問號 (wild card)
在檔名擴充套件(filename expansion)上扮演的角色是匹配乙個任意的字元,但不包含 null 字元。
# ls a?a1
善用她的特點,可以做比較精確的檔名匹配。
* 星號 (wild card)
相當常用的符號。在檔名擴充套件(filename expansion)上,她用來代表任何字元,包含 null 字元。
# ls a*a a1 access_log
在運算時,它則代表 「乘法」。
let 「fmult=2*3″
除了內建指令 let,還有乙個關於運算的指令 expr,星號在這裡也擔任」乘法」的角色。不過在使用上得小心,他的前面必須加上escape 字元。
** 次方運算
兩個星號在運算時代表 「次方」 的意思。
let 「sus=2**3″echo 「sus = $sus」 # sus = 8
$ 錢號(dollar sign)
變數替換(variable substitution)的代表符號。
vrs=123echo 「vrs = $vrs」 # vrs = 123
另外,在 regular expressions 裡被定義為 「行」 的最末端 (end-of-line)。這個常用在 grep、sed、awk 以及 vim(vi) 當中。
一些shell符號
傳遞到指令碼的引數個數 以乙個單字串顯示所有向指令碼傳遞的引數,與位置變數不同,此選項引數可超過9個 指令碼執行的當前程序id號 後台執行的最後乙個程序的程序id號 與 相同,但是使用時加引號,並在引號中返回每個引數 顯示shell使用的當前選項,與set命令功能相同 顯示最後命令的退出狀態。0表示...
shell 一些符號的使用
給你個全的,你在linux環境下多試下就明白了 0 這個程式的執行名字 n 這個程式的第n個引數值,n 1.9 這個程式的所有引數,此選項引數可超過9個。這個程式的引數個數 這個程式的pid 指令碼執行的當前程序id號 執行上乙個背景指令的pid 後台執行的最後乙個程序的程序id號 執行上乙個指令的...
shell下的一些符號問題
今天編寫了乙個測試程式 執行在linux環境下 其中要將一些命令字串預先儲存在乙個檔案中,然後測試程式從檔案中讀取這些命令串。這些命令串中,欄位與字段之間是用 t 分隔符分開,每個命令串的結束,還要用 r n 結尾。開始時,我只是簡單的將這樣的命令串,比如 305 t00 14 22 9c 22 9...