shell的一些符號

2021-07-15 06:40:02 字數 4466 閱讀 6895



# ; ;; . , / / 『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...