歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

Linux Shell常用技巧大全

一. 特殊文件: /dev/null和/dev/tty

Linux系統提供了兩個對Shell編程非常有用的特殊文件,/dev/null和/dev/tty。其中/dev/null將會丟掉所有寫入它的數據,換句換說,當程序將數據寫入到此文件時,會認為它已經成功完成寫入數據的操作,但實際上什麼事都沒有做。如果你需要的是命令的退出狀態,而非它的輸出,此功能會非常有用,見如下Shell代碼:
/> vi test_dev_null.sh

#!/bin/bash
if grep hello TestFile > /dev/null
then
echo "Found"
else
echo "NOT Found"
fi
在vi中保存並退出後執行以下命令:
/> chmod +x test_dev_null.sh #使該文件成為可執行文件
/> cat > TestFile
hello my friend
CTRL + D #退出命令行文件編輯狀態
/> ./test_dev_null.sh
Found #這裡並沒有輸出grep命令的執行結果。
將以上Shell腳本做如下修改:
/> vi test_dev_null.sh

#!/bin/bash
if grep hello TestFile
then
echo "Found"
else
echo "NOT Found"
fi
在vi中保存退出後,再次執行該腳本:
/> ./test_dev_null.sh
hello my friend #grep命令的執行結果被輸出了。
Found

下面我們再來看/dev/tty的用途。當程序打開此文件是,Linux會自動將它重定向到一個終端窗口,因此該文件對於讀取人工輸入時特別有用。見如下Shell代碼:
/> vi test_dev_tty.sh

#!/bin/bash
printf "Enter new password: " #提示輸入
stty -echo #關閉自動打印輸入字符的功能
read password < /dev/tty #讀取密碼
printf "\nEnter again: " #換行後提示再輸入一次
read password2 < /dev/tty #再讀取一次以確認
printf "\n" #換行
stty echo #記著打開自動打印輸入字符的功能
echo "Password = " $password #輸出讀入變量
echo "Password2 = " $password2
echo "All Done"

在vi中保存並退出後執行以下命令:
/> chmod +x test_dev_tty.sh #使該文件成為可執行文件
/> ./test_dev_tty
Enter new password: #這裡密碼的輸入被讀入到腳本中的password變量
Enter again: #這裡密碼的輸入被讀入到腳本中的password2變量
Password = hello
Password2 = hello
All Done

二. 簡單的命令跟蹤:

Linux Shell提供了兩種方式來跟蹤Shell腳本中的命令,以幫助我們准確的定位程序中存在的問題。下面的代碼為第一種方式,該方式會將Shell腳本中所有被執行的命令打印到終端,並在命令前加"+":加號的後面還跟著一個空格。
/> cat > trace_all_command.sh
who | wc -l #這兩條Shell命令將輸出當前Linux服務器登錄的用戶數量
CTRL + D #退出命令行文件編輯狀態
/> chmod +x trace_all_command.sh
/> sh -x ./trace_all_command.sh #Shell執行器的-x選項將打開腳本的執行跟蹤功能。
+ wc -l #被跟蹤的兩條Shell命令
+ who
2 #實際輸出結果。
Linux Shell提供的另一種方式可以只打印部分被執行的Shell命令,該方法在調試較為復雜的腳本時,顯得尤為有用。
/> cat > trace_patial_command.sh
#! /bin/bash
set -x #從該命令之後打開跟蹤功能
echo 1st echo #將被打印輸出的Shell命令
set +x #該Shell命令也將被打印輸出,然而在該命令被執行之後,所有的命令將不再打印輸出
echo 2nd echo #該Shell命令將不再被打印輸出。
CTRL + D #退出命令行文件編輯狀態
/> chmod +x trace_patial_command.sh
/> ./trace_patial_command.sh
+ echo 1st echo
1st echo
+ set +x
2nd echo

三. 正則表達式基本語法描述:

Linux Shell環境下提供了兩種正則表達式規則,一個是基本正則表達式(BRE),另一個是擴展正則表達式(ERE)。
下面是這兩種表達式的語法列表,需要注意的是,如果沒有明確指出的Meta字符,其將可同時用於BRE和ERE,否則將盡適用於指定的模式。

元字符

模式含義

用例

\

通常用於關閉其後續字符的特殊意義,恢復其原意。

\(...\),這裡的括號僅僅表示括號。

.

匹配任何單個字符。

a.b,將匹配abb、acb等

*

匹配它之前的0-n個的單個字符。

a*b,將匹配ab、aab、aaab等。

^

匹配緊接著的正則表達式,在行的起始處。

^ab,將匹配abc、abd等,但是不匹配cab。

$

匹配緊接著的正則表達式,在行的結尾處。

ab$,將匹配ab、cab等,但是不匹配abc。

[...]

方括號表達式,匹配其內部任何字符。其中-表示連續字符的范圍,^符號置於方括號裡第一個字符則有反向的含義,即匹配不在列表內(方括號)的任何字符。如果想讓]和-表示其原意,需要將其放置在方括號的首字符位置,如[]ab]或[-ab],如這兩個字符同時存在,則將]放置在首字符位置,-放置在最尾部,如[]ab-]。

[a-bA-Z0-9!]表示所有的大小寫字母,數字和感歎號。[^abc]表示a、b、c之外的所有字符。[Tt]om,可以匹配Tom和tom。

\{n,m\}

區間表達式,匹配在它前面的單個字符重復出現的次數區間,\{n\}表示重復n次;\{n,\}表示至少重復n次;\{n,m\}表示重復n到m次。

ab\{2\}表示abb;ab\{2,\}表示abb、abbb等。ab\{2,4\}表示abb、abbb和abbbb。

\(...\)

將圓括號之間的模式存儲在特殊“保留空間”。最多可以將9個獨立的子模式存儲在單個模式中。匹配於子模式的文本,可以通過轉義序列\1到\9,被重復使用在相同模式裡。

\(ab\).*\1表示ab組合出現兩次,兩次之間可存在任何數目的任何字符,如abcdab、abab等。

{n,m}(ERE)

其功能等同於上面的\{n,m\},只是不再寫\轉義符了。

ab+匹配ab、abbb等,但是不匹配a。

+(ERE)

和前面的星號相比,+匹配的是前面正則表達式的1-n個實例。

 

?(ERE)

匹配前面正則表達式的0個或1個。

ab?僅匹配a或ab。

|(ERE)

匹配於|符號前後的正則表達式。

(ab|cd)匹配ab或cd。

[:alpha:]

匹配字母字符。

[[:alpha:]!]ab$匹配cab、dab和!ab。

[:alnum:]

匹配字母和數字字符。

[[:alnum:]]ab$匹配1ab、aab。

[:blank:]

匹配空格(space)和Tab字符。

[[:alnum:]]ab$匹配1ab、aab。

[:cntrl:]

匹配控制字符。

 

[:digit:]

匹配數字字符。

 

[:graph:]

匹配非空格字符。

 

[:lower:]

匹配小寫字母字符。

 

[:upper:]

匹配大寫字母字符。

 

[:punct:]

匹配標點字符。

 

[:space:]

匹配空白(whitespace)字符。

 

[:xdigit:]

匹配十六進制數字。

 

\w

匹配任何字母和數字組成的字符,等同於[[:alnum:]_]

 

\W

匹配任何非字母和數字組成的字符,等同於[^[:alnum:]_]

 

\<\>

匹配單詞的起始和結尾。

\<read匹配readme,me\>匹配readme。

下面的列表給出了Linux Shell中常用的工具或命令分別支持的正則表達式的類型:

 

grep

sed

vi

egrep

awk

BRE

*

*

*

   

ERE

     

*

*

Copyright © Linux教程網 All Rights Reserved