shell程式設計中特殊字元的問題總結

2021-09-22 03:28:16 字數 4463 閱讀 1296

萬用字元( * ):

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...