Shell 通配符(wildcard)html
初學者容易將通配符和正則表達式弄混淆。正則表達式
通配符(wildcard)即,*,?,[-],[^],[],等只適用於shell命令行中的path參數(路徑名,文件名);對於非shell的應用而言,沒有wildcard這個概念。shell
* | 表明『 0 個或無窮多個』任意字符 |
? | 表明『必定有一個』任意字符 |
[ ] | 一樣表明『必定有一個在括號內』的字符(非任意字符)。例如 [abcd] 表明『必定有一個字符,express 多是 a, b, c, d 這四個任何一個』vim |
[ - ] | 如有減號在中括號內時,表明『在編碼順序內的全部字符』。例如 [0-9] 表明 0 到 9 之間的全部數字,由於數字的語系編碼是連續的!bash |
[^ ] | 若中括號內的第一個字符爲指數符號 (^) ,那表示『反向選擇』,例如 [^abc] 表明 必定有一個字符,只要是非 a, b, c 的其餘字符就接受的意思。工具 |
舉例:列出當前目錄下文件名含字母b的文件信息,編碼
drwxr-xr-x 8 srsy users 4096 Jul 6 11:03 .
drwxr-xr-x 5 root root 4096 Jul 5 23:25 ..
-rw------- 1 srsy users 1027 Jul 6 00:04 .bash_history
-rw-r--r-- 1 srsy users 1177 Jul 5 23:25 .bashrc
-rw-r--r-- 1 srsy users 1637 Jul 5 23:25 .emacs
drwxr-xr-x 2 srsy users 4096 Jul 5 23:25 .fonts
-rw-r--r-- 1 srsy users 861 Jul 5 23:25 .inputrc
drwxr-xr-x 2 srsy users 4096 Jul 5 23:25 .mozilla
-rw-r--r-- 1 srsy users 1028 Jul 5 23:25 .profile
-rw------- 1 srsy users 578 Jul 5 20:15 .viminfo
-rw-r--r-- 1 srsy users 1940 Jul 5 23:25 .xim.template
-rwxr-xr-x 1 srsy users 1446 Jul 5 23:25 .xinitrc.template
drwxr-xr-x 2 srsy users 4096 Jul 5 23:25 Documents
-rw-r--r-- 1 srsy users 2128 Jul 5 20:17 aaa
drwxr-xr-x 2 srsy users 4096 Jul 5 23:25 bin
drwxr-xr-x 2 srsy users 4096 Jul 5 23:25 public_html
-rw-r--r-- 1 srsy users 650 Jan 26 2005 regular_express.txt
drwxr-xr-x 7 root root 4096 Jul 5 17:10 vmware-tools-distrib
ls -al ./*b* 可達到目的spa
正則表達式: 用在字符串處理上面的一項表達式,主用用於文本內容中的字符串搜索和替換。命令行
正則表達式是一種」表示法「,只要工具程序支持這種表示法,那麼該工具程序就能夠做爲正則表達式的字符串處理之用。
支持正則表達式的工具:vim, grep, awk, sed.
從ls -al ./ 返回結果(字符串)中,篩選出含有b的行:
ls -al ./ | grep '.*b.*' 這個是對的,用正則表達式
ls -al ./ | grep *b* 這個是錯的,想用通配符,可是這裏不適用。
舉例:找出~目錄下含有字符*的文件
grep '\*' ./ 錯誤
grep '\*' ./* 正確
變量
Linux中的字符串,單引號,雙引號
字符串中的每個字符多是以下兩種中的一個,
Shell的 command line 包含三部分:command_name option argument ,shell會依據 IFS (Internal Field Seperator) 將 command line 所輸入的文字給拆解爲"字段"(word)。而後再針對特殊字符(meta)先做處理,最後再重組整行 command line. 用戶輸入完命令行後,按enter健後會產生CR,Carriage Return,告訴 shell: 老兄你能夠執行個人命令行了。
假如咱們須要在 command line 中將這些meta保留字元的功能關閉的話,就須要 quoting 處理了,在 bash 中,經常使用的 quoting 有以下三種方法:
用法:
舉例:
舉例:
將 /etc/passwd 的第一欄叏出,並且每一欄都以一行字符串『The 1 account is "root" 』來顯示,那個 1 表示行數。
awk 'BEGIN {FS=":"} {print "The " NR " account is:\t" \" $1 \"}' /etc/passwd 提示出錯:^ backslash not last character on line
awk 'BEGIN {FS=":"} {print "The " NR " account is:\t" """ ($1) """}' /etc/passwd 結果是:The 1 account is: ($1)
awk 'BEGIN {FS=":"} {print "The " NR " account is:\t" "\"" $1 "\""}' /etc/passwd 這樣才能輸出」root"這種帶引號的格式
`` 和 $() :
$(command) 與 `command` (反引號) 都是用來作命令替換用(command substitution)的。所謂的命令替換與咱們第五章學過的變量替換差很少,都是用來着組命令行,即:完成反引號或括號裏的命令行,而後將其結果替換出來,再着組新命令行。如,
# echo the last sunday is $(date -d "last sunday" +%Y-%m-%d) 先執行$()裏的命令,獲得的結果從新組裝到命令echo參數中
${} :
${var} 其實就是用來做變量替換用的啦。通常情況下,$var 與 ${var} 並沒有啥不同,可是用 ${} 會比較精確的界定變量名稱的範圍,主要用於字符串拼接的時候。比方,
判斷方法test 和 [] : 《鳥叔P382》
[ "$HOME" == "/root " ];echo $? 注意格式。變量?記錄上一條指令的結果。爲0表示執行成功,反之失敗
[ "$yn" == "Y" -o "$yn" == "y" ] && echo "OK,continue" && exit 0
中括號的使用方法和test幾乎同樣。只是中括號常常用在條件判斷式if...then...fi的狀況中就是了
[ "$yn" == "Y" -o "$yn" == "y" ] 等效於 [ "$yn" == "Y" ] || [ "$yn" == "y" ]
Linux中的字符串,單引號,雙引號
$(command)
script的執行方式:
shell十三問