shell 中的 eval 及 crontab 命令

eval

eval會對後面的命令進行兩遍掃描,若是第一遍掃描後,命令是個普通命令,則執行此命令;若是命令中含有變量的間接引用,則保證間接引用的語義。也就是說,eval命令將會首先掃描命令行進行全部的置換,而後再執行該命令。所以,eval命令適用於那些一次掃描沒法實現其功能的變量。linux

eval 執行如下兩個步驟shell

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

栗子:apache

1.  有一個名爲test的文件,其內容爲「Please move on !」,定義一個內容是cat test的字符串變量,利用echo 命令引用該變量, 則直接打印該字符串,而用eval  則會輸出文件test的內容!bash

這是因爲執行eval命令第一次掃描進行了變量置換,第二次掃描執行了該字符串所包含的命令cat test。編輯器

2.取得傳給shell腳本的最後一個參數函數

  若是咱們知道傳遞給shell的參數個數,想要輸出最後一個參數,可使用echo直接顯示,例如,本例中輸入的參數有十、十一、12共三個參數,可使用命令: echo $3spa

  可是若是咱們不知道有幾個參數,卻想輸出最後一個參數,你們可能會想到使用 $$# ( $# 爲傳給shell腳本的參數個數)來輸出最後一個參數。操作系統

  若是使用命令: echo "\$$#"  獲得的結果是 $3,而不是咱們想要的12。命令行

  使用eval命令就能夠達到咱們的預期:  eval echo "\$$#"    則獲得的結果爲12。3d

shell腳本內容:

 

執行腳本文件:

3.再好比:

[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
#每個月一、十、22日的4 : 45重啓apache
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
#每週6、週日的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
相關文章
相關標籤/搜索