shell编程中特殊字符的问题总结
生活随笔
收集整理的這篇文章主要介紹了
shell编程中特殊字符的问题总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
shell編程中特殊字符的問題總結
--同事王怡春的總結:近日在編寫shell腳本的遇到的一些問題,然后上網搜搜學習后,以下是總結后的版本,給大家分享,如有問題,錯誤,歡迎指正?
一 通配符( * ): 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或者<Enter>組成,用來分隔字符的字符,shell視它們為命令中一個字符的結束,后面跟的會是另外的命令或者字符,與它們前面的東西沒有關聯 ??? (2)CR?? 由<Enter>產生,它的作用就是結束命令行的輸入,開始執行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' $x howard@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_{finger,toe}s ??????? 這條命令相當于如下兩個命令的組合: ????? ls my_fingers ; ls my_toes ? eg: 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,這幾個目錄 ? 可用于語句塊的構造,命令之間可用回車隔開?
用法二:參數擴展 ???? ${name:-default} 使用一個默認值(一般是空值)來代替那些空的或者沒有賦值的變量name; ???? ${name:=default}使用指定值來代替空的或者沒有賦值的變量name; ???? ${name:?message}如果變量為空或者未賦值,那么就會顯示出錯誤信息并中止腳本的執行同時返回退出碼1。 ???? ${#name} 給出name的長度 ???? ${name%word} 從name的尾部開始刪除與word匹配的最小部分,然后返回剩余部分 ???? ${name%%word} 從name的尾部開始刪除與word匹配的最長部分,然后返回剩余部分 ???? ${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=0 ????? hile [ "$x" -ne 10 ];do ????? echo $x ????? x=$(($x+1)) ????? done ???? exit 0轉載于:https://blog.51cto.com/tianya23/281878
總結
以上是生活随笔為你收集整理的shell编程中特殊字符的问题总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle10g/11g数据库性能的诊
- 下一篇: 什么是p30 pro和p30手机,它有什