一. 特殊文件: /dev/null和/dev/ttymysql
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
二. 簡單的命令跟蹤:sql
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
四. 使用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
五. 計算行數、字數以及字符數:bash
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退出到命令行提示符狀態。