Linux 入門 2 (正則表達式和 Shell Script)

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 '\*' ./*       正確

 


  變量   

  • var=abc 或者'abc' 或者"abc"  變量爲var,賦值爲abc,Linux中變量是沒有類型的,就是字符串,不管是否加引號都被看做是字符串
  • $ : 引用一個變量的內容。

Linux中的字符串,單引號,雙引號

   字符串中的每個字符多是以下兩種中的一個,

  • literal:也就是普通純文字,對 shell 來講沒特殊功能。好比,aabc,113adag,等
  • meta:對 shell 來講,具備特定功能的特殊保留字元。好比,字符串中包含IFS(space,tab,enter)、CR、以及(),[],=,$,&,等等

  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 有以下三種方法:

  •  hard quote:' ' (單引號)  凡在 hard quote 中的全部 meta 均被關閉。
  •  soft quote: " " (雙引號)   在 soft quoe 中大部份 meta 都會被關閉,但某些則保留(如 $ )。(注二) 
  •  escape : \ (反斜線)    只有緊接在 escape (跳脫字符)以後的單一 meta 才被關閉。 

  用法:

  •   對於普通純文字的字符串,能夠不加引號,能夠加單引號或雙引號
  •   對於包含meta的字符串,看狀況加單引號或雙引號

  舉例:

  •   x=aa\nbb    顯示結果爲:aanbb
  •   x='aa\nbb'    顯示結果爲:aa\nbb
  •   x="aa\nbb"   顯示結果爲:aa\nbb
  •   x=aa bb      運行出錯,提示 -bash: bb: command not found
  • touch "test me" 和 touch test me
  • echo "'$PATH'" 和 echo '$PATH'
  • echo "*" 和 echo *
  • ls "~" 和 ls ~
  • ls "> out1" 和 ls > out1
  • 我想顯示「root",則 a=\"$USER\" 或者 a="\"$USER\"",不能 a=‘\"$SUER\"'

  舉例:

  將 /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} 並沒有啥不同,可是用 ${} 會比較精確的界定變量名稱的範圍,主要用於字符串拼接的時候。比方,

  • # echo $AB     將認爲是變量AB
  • # echo ${A}B   將變量A添加一個字符'B'

判斷方法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的執行方式:

  •  直接執行
  •  利用source或小數點(.)執行

 

shell十三問

相關文章
相關標籤/搜索