標籤:cgi shell getopts expr awk
第二十五章 深入討論 <<
當shell 看到 << 的時候,它知道下一個詞是一個分界符,該分界符後面的內容都被當做輸入,直到shell又看到該分界符(位於單獨的一行)。比如:
cat >> tmpfile <<DOC> this is the first line> this is the second line> third> forth>.....>DOC
其中DOC就是分界符,再次在新的行中輸入DOC時,表示輸入已經完成。
快速建立一個檔案
自動進入菜單
ftp傳輸(執行個體操作)
串連到其他應用系統 (執行個體操作)
快速建立檔案
cat >> tmpfile <<delimiter(加入tab鍵後有的系統不能識別) 或者 cat >> tmpfile <<-delimiter
快速建立列印文檔 (輸入文檔後,按enter鍵自動送往印表機): lpr << qc
第二十六章 shell工具
建立以日期命名的檔案及臨時檔案
訊號
trap命令以及如何捕獲訊號
eval命令
logger命令
使用date命令建立檔案:
date格式: date [option] +%format (詳情請自己查閱 date --help)
工作中經常會定義一些屬於自己的檔案格式下面就以 XXX_XXX_日期資訊.log建立檔案:
其中日期資訊的命令 date +%Y_%m_%d:%H:%M:%S.%N
建立檔案的命令: >XXX_XXX_`date +%Y_%m_%d:%H:%M:%S.%N`.log ,ls將看到如下檔案:
XXX_XXX_2014_10_17:08:30:21.128727204.log
建立唯一的臨時檔案: 使用 $$(進程號) 建立指令碼運行中 唯一的臨時檔案(系統中進程號是唯一的),退出程式時刪除臨時檔案 。
訊號
訊號就是系統向指令碼或命令發出的訊息。常用訊號及其含義表(kill -l 顯示所有的訊號):
訊號<span style="white-space:pre"></span>訊號名含義 1SIGHUP掛起或父進程被殺死 2SIGINT來自鍵盤的中斷訊號,通常是< CTRL-C> 3SIGQUIT從鍵盤退出 9SIGKILL無條件終止 11SIGSEGV段(記憶體)衝突 15SIGTERM軟體終止(預設殺進程訊號)
發送訊號的格式:kill [ -signal | -s signal ] PID[s]
殺死一個進程
關閉當前shell:kill -9 $$ (另外可以用 ps 查詢進程資訊)
活動訊號
有些訊號可以被程式或指令碼捕獲,但是有些訊號不能被捕獲(接收到訊號9後就不能再接收其他訊號)。
指令碼中需要關注的訊號是 1 SIGHUP 、2 SIGINT 、3 SIGQUIT 、15 SIGTERM
捕獲到這些訊號後交給系統處理,或者 由指令碼或應用自行處理這些訊號(需要用到trap命令)。
trap
trap 命令 可以在指令碼中捕捉訊號, trap name(捕捉到訊號後的處理函數) signal(s)
trap常用方法舉例:
trap "" 2 3忽略訊號2和訊號3,使用者不能終止該指令碼trap"commands" 2 3如果捕捉到訊號2或3,就執行相應的c o m m a n d s命令trap 2 3複位訊號2和3,使用者可以終止該指令碼也可以使用單引號(‘’)來代替雙引號(“”);其結果是一樣的。
下面給出一個監聽鍵盤中斷<CTRL_C>樣本:
#!/bin/bash trap "keyboardIntHandler" 2function keyboardIntHandler(){ echo "CTRL_C pressed !"}while [ 1 ] do sleep 2done
eval
eval 使用域一次掃描無法實現其功能的變數——它首先會掃描命令列進行所有的置換 , 然後再執行命令。
執行含有命令的字串:
#!/bin/bash NAME='cat Ctrl_c_Listener'echo -e $NAME '\n\n'eval $NAME
從上述執行結果比較,發現eval 回顯的是檔案的內容,而不是name的字串值。
對於一個僅僅存有名-值對的檔案,使用eval可以將第一列作為變數,而第二列作為值,範例程式碼如下:
key_value_pair 的內容:key_one timekey_two lovekey_three mum指令碼kv_eval的內容:#!/bin/bash while read NAME TYPEdo eval `echo "${NAME}"="${TYPE}"`done < key_value_pairecho "key_one's value is ${key_one}"echo "key_two's value is ${key_two}"
logger命令:
使用該命令之前最好先查閱線上手冊(不同供應商提供的作業系統中該命令的文法不一樣)。
logger命令格式: logger [ options ] message
ubuntu 12.04中的選項:
-d, --udp use UDP (TCP is default) -i, --id log the process ID too -f, --file <file> log the contents of this file -h, --help display this help text and exit -n, --server <name> write to this remote syslog server -P, --port <number> use this UDP port -p, --priority <prio> mark given message with this priority -s, --stderr output message to standard error as well -t, --tag <tag> mark every line with this tag -u, --socket <socket> write to this Unix socket -V, --version output version information and exit
第27章 幾個指令碼例子
pingall:一個按照/etc/hosts檔案中的條目逐一ping所有主機的指令碼。
backup_gen:一個通用的備份指令碼,能夠載入預設設定。
del.lines:一個引用sed命令的指令碼,能從檔案中刪除若干行。
access_deny:一個能夠阻止某些特定使用者登入的工具。
logroll:一個能夠清除超過某一長度的日誌的工具。
nfsdown:一個快速unmount所有nfs檔案系統的工具
實踐。
第28章 運行層級指令碼
如果希望在系統啟動時自動運行某些應用程式、服務或指令碼,或者在系統重啟動時能夠正確地關閉這些程式,那麼需要建立運行層級指令碼。
運行層級
確定當前的運行層級: who -r (linux 系統: runlevel 第一隻個值是系統的前一個運行層級,第二隻值是當前運行層級。)
inittab
系統啟動過程中會啟動init進程,該進程通過inittab的設定檔來查看需要啟動哪些服務、應當進入哪一個運行層級。
inittab格式: id:rstart:action:process
id: 進程的唯一標識
rstart:運行該進程的層級
action:告訴init進程如何對待process所對應的進程。
process:實際要啟動並執行命令。
第二十九章 cgi 指令碼
cgi : common gateway interface (通用閘道介面)。
串連web的協議:協議包括http、ftp、mailto、file、telnet和news。這裡我們只關心http協議(超文字傳輸通訊協定 (HTTP))。
該章主要講解 web操作,實踐。
Linux Unix shell 編程指南學習筆記(第五部分)