一. 特殊文件: /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,否則將盡適用於指定的模式。
下面的列表給出了Linux Shell中常用的工具或命令分別支持的正則表達式的類型。
四. 使用cut命令選定字段:
cut命令是用來剪下文本文件裡的數據,文本文件可以是字段類型或是字符類型。下面給出應用實例:
/> cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
... ...
/> cut -d : -f 1,5 /etc/passwd #-d後面的冒號表示字段之間的分隔符,-f表示取分割後的哪些字段
root:root #這裡取出的是第一個和第五個字段。
bin:bin
daemon:daemon
adm:adm
... ...
/> cut -d: -f 3- /etc/passwd #從第三個字段開始顯示,直到最後一個字段。
0:0:root:/root:/bin/bash
1:1:bin:/bin:/sbin/nologin
2:2:daemon:/sbin:/sbin/nologin
3:4:adm:/var/adm:/sbin/nologin
4:7:lp:/var/spool/lpd:/sbin/nologin
... ...
這裡需要進一步說明的是,使用cut命令還可以剪切以字符數量為標量的部分字符,該功能通過-c選項實現,其不能與-d選項共存。
/> cut -c 1-4 /etc/passwd #取每行的前1-4個字符。
/> cut -c-4 /etc/passwd #取每行的前4個字符。
root
bin:
daem
adm:
... ...
/> cut -c4- /etc/passwd #取每行的第4個到最後字符。
t:x:0:0:root:/root:/bin/bash
:x:1:1:bin:/bin:/sbin/nologin
mon:x:2:2:daemon:/sbin:/sbin/nologin
:x:3:4:adm:/var/adm:/sbin/nologin
... ...
/> cut -c1,4 /etc/passwd #取每行的第一個和第四個字符。
rt
b:
dm
a:
... ...
/> cut -c1-4,5 /etc/passwd #取每行的1-4和第5個字符。
root:
bin:x
daemo
adm:x
五. 計算行數、字數以及字符數:
Linux提供了一個簡單的工具wc用於完成該功能,見如下用例:
/> echo This is a test of the emergency broadcast system | wc
1 9 49 #1行,9個單詞,49個字符
/> echo Testing one two three | wc -c
22 #22個字符
/> echo Testing one two three | wc -l
1 #1行
/> echo Testing one two three | wc -w
4 #4個單詞
/> wc /etc/passwd /etc/group #計算兩個文件裡的數據。
39 71 1933 /etc/passwd
62 62 906 /etc/group
101 133 2839 總用量
六. 提取開頭或結尾數行:
有時,你會需要從文本文件裡把幾行字,多半是靠近開頭或結尾的幾行提取出來。如查看工作日志等操作。Linux Shell提供head和tail兩個命令來完成此項工作。見如下用例:
/> head -n 5 /etc/passwd #顯示輸入文件的前五行。
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
/> tail -n 5 /etc/passwd #顯示輸入文件的最後五行。
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
pulse:x:496:494:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
stephen:x:500:500:stephen:/home/stephen:/bin/bash
如果使用者想查看不間斷增長的日志(如服務程序輸出的),可以使用tail的-f選項,這樣可以讓tail命令不會自動退出,必須通過CTRL+C命令強制退出,因此該選項不適合用於Shell腳本中,見如下用例:
/> tail -f -n 5 my_server_log
... ...
^C #CTRL+C退出到命令行提示符狀態。