首頁 > 軟體

shell 中的 eval 及 crontab 命令

2020-06-16 17:35:21

eval

eval會對後面的命令進行兩遍掃描,如果第一遍掃描後,命令是個普通命令,則執行此命令;如果命令中含有變數的間接參照,則保證間接參照的語意。也就是說,eval命令將會首先掃描命令列進行所有的置換,然後再執行該命令。因此,eval命令適用於那些一次掃描無法實現其功能的變數。

eval 執行以下兩個步驟

  • 第一次,執行變數替換,類似與C語言的宏替代
  • 第二次,執行替換後的命令串

栗子:

1.  有一個名為test的檔案,其內容為“Please move on !”,定義一個內容是cat test的字串變數,利用echo 命令參照該變數, 則直接列印該字串,而用eval  則會輸出檔案test的內容!

這是由於執行eval命令第一次掃描進行了變數置換,第二次掃描執行了該字串所包含的命令cat test。

2.取得傳給shell指令碼的最後一個引數

  如果我們知道傳遞給shell的引數個數,想要輸出最後一個引數,可以使用echo直接顯示,例如,本例中輸入的引數有10、11、12共三個引數,可以使用命令: echo $3

  但是如果我們不知道有幾個引數,卻想輸出最後一個引數,大家可能會想到使用 $$# ( $# 為傳給shell指令碼的引數個數)來輸出最後一個引數。

  如果使用命令: echo "$$#"  得到的結果是 $3,而不是我們想要的12。

  使用eval命令就可以達到我們的預期:  eval echo "$$#"    則得到的結果為12。

shell指令碼內容:

 

執行指令碼檔案:

3.再比如:

1
2
[admin@localhost test]$ G='|'
[admin@localhost test]$ eval ls $G wc -l

第一步變數替換為 eval ls | wc -l  第二部再執行命令結果  

注意:

  1. eval 不能獲得函數處理結果 
  2. eval 巢狀無意義 ,在其他語言中可以通過 eval(eval("code")) ,來執行(執行動態生成的 code 的返回),而由於shell 中 eval 將後面的 eval 命令簡單當作命令字串執行,失去了巢狀作用,巢狀被命令替換取代。 

crontab

  crond是linux下用來周期性的執行某種任務或等待處理某些事件的一個守護行程,系統會自動啟動crond進程,crond進程每分鐘會定期檢查是否有要執行的任務,如果有要執行的任務,則自動執行該任務。

  crontab檔案包含送交cron守護行程的一系列作業和指令。每個使用者可以擁有自己的crontab檔案;同時,作業系統儲存一個針對整個系統的crontab檔案,該檔案通常存放於/etc或者/etc之下的子目錄中,而這個檔案只能由系統管理員來修改。

  crontab命令用於設定系統周期性被執行的指令。該命令從標準輸入裝置讀取指令,並將其存放於“crontab”檔案中,以供之後讀取和執行。/etc/crontab檔案就是系統任務排程的組態檔。

引數:

 -l 在標準輸出上顯示當前的crontab。 

 -r 刪除當前的crontab檔案。 

 -e 使用VISUAL或者EDITOR環境變數所指的編輯器編輯當前的crontab檔案

 使用格式 :
  *      *   *   *   *  command
  分   時  日  月  周   命令

  第1列表示分鐘0~59 (每分鐘用*或者 */1表示)
  第2列表示小時0~23
  第3列表示日期1~31 
  第4列表示月份1~12 
  第5列標識號星期0~6(0表示星期天) 
  第6列表示需要執行的命令 

除了數位還有幾個個特殊的符號就是"*"、"/"和"-"、",",*代表所有的取值範圍內的數位。"/"代表每的意思,"/5"表示每5個單位,"-"代表從某個數位到某個數位,","分開幾個離散的數位。

crontab檔案的一些使用例子:


#每晚的21:30 重新啟動apache
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
#每月1、10、22日的4 : 45重新啟動apache
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
#每週六、週日的1 : 10重新啟動apache
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
#每天18 : 00至23 : 00之間每隔30分鐘重新啟動apache
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
#每星期六的11 : 00 pm重新啟動apache
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
#晚上11點到早上7點之間,每隔一小時重新啟動apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
#每一小時重新啟動apache
* */1 * * * /usr/local/etc/rc.d/lighttpd restart
#每月的4號與每週一到週三的11點重新啟動apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
#一月一號的4點重新啟動apache
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
#每半小時同步一下時間
*/30 * * * * /usr/sbin/ntpdate 210.72.145.44

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-08/134305.htm


IT145.com E-mail:sddin#qq.com