一萬用字元( * ):
wildcard是由shell處理的, 它只會出現在 command的argument 裡——既不用在 command_name裡,
也不用在 options 上。當在argument中碰到wildcard時,shell會將其當作路徑或檔名去在磁碟上搜尋可能的匹配:若符合要求的匹配存在,則進行代換(路徑擴充套件);否則就將該wildcard作為乙個普通字元傳遞給command,交由command自行處理
例如,若當前目錄下有cha1、cha2和des三個檔案,而我想用grep在des中搜尋包含字串cha的行,於是寫出命令如下:
grep cha* des ①
當該命令交由shell處理時,首先會將cha*中的*當作是乙個wildcard,於是就會在當前目錄中搜尋可能的匹配。*作為wildcard而言匹配的是0個或多個的任意字元,於是檔案cha1和cha2符合匹配要求,shell自行完成了該命令的重組,重組後的命令為:
grep cha1 cha2 des ②
而這才是最終執行的命令的文字形式。所以命令①實際上的動作是試圖在檔案cha2和des中尋找包含cha1字串的行。這和期望grep所作的動作是大相徑庭的。
可是,如果當前目錄下沒有可以匹配cha*的檔案或是資料夾(路徑),那麼shell會因為找不到可能的匹配而放棄*號的代換,將其傳遞給command處理,重組後的命令如下:
grep cha* des ③
bash在通配(globbing)中解釋特殊字元的行為是可以修改的. set -f命令可以禁用通配(globbing),
二 quoting(轉義):
1我們說了shell就是乙個命令直譯器,當shell收到回車符時,shell開始解釋整個命令列的命令,如引數,變數,常量等等。那麼shell把怎樣的字元當作變數呢,它又把怎樣的字元當作常量呢?這裡就不得不提到shell中的兩種字元:
(1)literal : 就是普通字元
對shell而言沒有什麼特殊的意義,比如:aa 123213等
(2)meda : shell的一些元字元,在shell中元字元是保留的有特殊用法的字元
這裡先介紹兩個最為常用的元字元:
(1)ifs 由空格,tab或者
組成,用來分隔字元的字元,shell視它們為命令中乙個字元的結束,後面跟的會是另外的命令或者字元,與它們前面的東西沒有關聯
(2)cr 由
產生,它的作用就是結束命令列的輸入,開始執行shell命令
除了 ifs 與 cr ,常用的 meta 還有:
= :設定變數。
$ :作變數或運算替換。
> :重導向 stdout。
< :重導向 stdin。
|:命令管線。
& :重導向 file descriptor ,或將命令置於背境執行。
( ):將其內的命令置於 nested subshell 執行,或用於運算或命令替換。
:將其內的命令置於 non-named function 中執行,或用在變數替換的界定範圍。
; :在前乙個命令結束時,而忽略其返回值,繼續執行下乙個命令。
&& :在前乙個命令結束時,若返回值為 true,繼續執行下乙個命令。
|| :在前乙個命令結束時,若返回值為 false,繼續執行下乙個命令。
!:執行 history 列表中的命令
假如我們需要在 command line 中將這些保留字元的功能關閉的話,就需要quoting 處理了。shell中的meta、有時會和command中的meta相同,為了讓command中的meta不被shell解析以至於改變,就必須用shell quoting(單引號,雙引號,反斜線)來保證其文字不變性。:
* hard quote:' ' (單引號),凡在 hard quote 中的所有 meta 均被關閉。
* soft quote: " " (雙引號),在 soft quoe 中大部份 meta 都會被關閉,但某些則保留
* escape : \ (反斜線),只有緊接在 escape (跳脫字元)之後的單一 meta才被關閉。
1. 單引號 ( ' ' )
howard@0[script]$ grep susan phonebook
susan goldberg 403-212-4921
susan topple 212-234-2343
如果我們想查詢的是susan goldberg,不能直接使用grep susan goldberg phonebook命令,grep會把goldberg和phonebook當作需要搜尋的檔案
howard@0[script]$ grep 'susan gold' phonebook
susan goldberg 403-212-4921
當shell碰到第乙個單引號時,它忽略掉其後直到右引號的所有特殊字元
2. 雙引號 ( " " )
雙引號作用與單引號類似,區別在於它沒有那麼嚴格。單引號告訴shell忽略所有特殊字元,而雙引號只要求忽略大多數,具體說,括在雙引號中的四種特殊字元不被忽略:$,\,` ,! (歷史命令) ,
howard@0[script]$ x=*
howard@0[script]$ echo $x
hello.sh menus.sh misc.sh phonebook tshift.sh
howard@0[script]$ echo '$x'
$xhoward@0[script]$ echo "$x"
*3. 反斜槓 backslash-escaped( \ )
反斜槓一般用作轉義字元,或稱逃脫字元,放在指令前,有取消 aliases 的作用;放在特殊符號前,則該特殊符號的作用消失;放在指令的最末端,表示指令連線下一行
三補充一些特殊符號:
3. 反引號(``)
命令替換是指shell能夠將乙個命令的標準輸出插在乙個命令列中任何位置。shell中有兩種方法作命令替換:把shell命令用反引號或者$(...)結構括起來,其中,$(...)格式受到posix標準支援,也利於巢狀。
howard@0[script]$ echo the date and time is `date`
the date and time is 三 6月 15 06:10:35 cst 2005
howard@0[script]$ echo your current working directory is $(pwd)
your current working directory is /home/howard/script.
1、{} 大括號:
eg: ls my_s
這條命令相當於如下兩個命令的組合:
ls my_fingers ; ls my_toes
eg: mkdir -
我們得到 usera-home, usera-bin, usera-data, userb-home, userb-bin, userb-data,
userc-home, userc-bin, userc-data,這幾個目錄
可用於語句塊的構造,命令之間可用回車隔開
用法二:引數擴充套件
$ 使用乙個預設值(一般是空值)來代替那些空的或者沒有賦值的變數name;
$使用指定值來代替空的或者沒有賦值的變數name;
$如果變數為空或者未賦值,那麼就會顯示出錯誤資訊並中止指令碼的執行同時返回退出碼1。
$ 給出name的長度
$ 從name的尾部開始刪除與word匹配的最小部分,然後返回剩餘部分
$ 從name的尾部開始刪除與word匹配的最長部分,然後返回剩餘部分
$ 從name的頭部開始刪除與word匹配的最小部分,然後返回剩餘部分
$ 從name的頭部開始刪除與word匹配的最長部分,然後返回剩餘部分
(注,name為變數名,word為要匹配的字串)
2、 中括號:允許匹配方括號中任何乙個單個字元
eg: ls /[eh][to][cm]*
相當於執行 ls /etc 和 ls /home
3、and列表 statement1 && statement2 && statement3 && ……:只有在前面所有的命令都執行成功的情況下才執行後一條命令
4、or列表 statement1 || statement2 || statement3 || ……:允許執行一系列命令直到有一條命令
成功為止,其後所有命令將不再被執行
5、** 次方運算:兩個星號在運算時代表 "次方" 的意思
eg:let "sus=2**3"
echo "sus = $sus"
# sus = 8
6、$((...))語法:對括號內的表示式求值
eg:#!/bin/sh
x=0hile [ "$x" -ne 10 ];do
echo $x
x=$(($x+1))
done
exit 0
shell中的特殊字元
shell中除使用普通字元外,還可以使用一些具有特殊含義和功能的特殊字元。在使用它們時應注意其特殊的含義和作用範圍。下面分別對這些特殊字元加以介紹。1.萬用字元 萬用字元用於模式匹配,如檔名匹配 路經名搜尋 字串查詢等。常用的萬用字元有 和括在方括號 中的字串行。使用者可以在作為命令引數的檔名中包含...
shell指令碼程式設計 特殊字元
shell中除了普通字元外,還有很多具有特殊含義和功能的字元 1.萬用字元 任意長度的字串 匹配任一單個字元 匹配其中的任意乙個字元,例如 abc 匹配a或b或c,也可這樣表示 a z 但 在外只是乙個普通字元,和?在中也變成了普通字元.2.引號 單引號 稱為 強引用 或 全引用,在 中的所有字元都...
shell的特殊字元
點 命令 點 命令是乙個shell內部命令,它可以使使用者在當前的shell中執行程式,而不建立子程序。注釋 shell指令碼的注釋符號 重定向符 用法 command filename,可以將command的輸出儲存在filename檔案中。同 類似,但表示追加。用法 command filena...