eval
eval會對後面的命令進行兩遍掃描,如果第一遍掃描後,命令是個普通命令,則執行此命令;如果命令中含有變量的間接引用,則保證間接引用的語義。也就是說,eval命令將會首先掃描命令行進行所有的置換,然後再執行該命令。因此,eval命令適用於那些一次掃描無法實現其功能的變量。
eval 執行以下兩個步驟
- 第一次,執行變量替換,類似與C語言的宏替代
- 第二次,執行替換後的命令串
栗子:
1. 有一個名爲test的文件,其內容爲“Please move on !”,定義一個內容是cat test的字符串變量,利用echo 命令引用該變量, 則直接打印該字符串,而用eval 則會輸出文件test的內容!
這是由於執行eval命令第一次掃描進行了變量置換,第二次掃描執行了該字符串所包含的命令cat test。
* 這裏只有兩級間接,可以用括號表示: test=$(cat test)
* eval的本質作用就是加一級間接。
2.取得傳給shell腳本的最後一個參數
如果我們知道傳遞給shell的參數個數,想要輸出最後一個參數,可以使用echo直接顯示,例如,本例中輸入的參數有10、11、12共三個參數,可以使用命令: echo $3
但是如果我們不知道有幾個參數,卻想輸出最後一個參數,大家可能會想到使用 $$# ( $# 爲傳給shell腳本的參數個數)來輸出最後一個參數。
如果使用命令: echo "\$$#" 得到的結果是 $3,而不是我們想要的12。
使用eval命令就可以達到我們的預期: eval echo "\$$#" 則得到的結果爲12。
3.再比如:
1
2
|
[admin@localhost test ]$
G= '|' [admin@localhost test ]$ eval ls $G wc -l |
第一步變量替換爲 eval ls | wc -l 第二部再執行命令結果
注意:
- eval 不能獲得函數處理結果
- 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文件的一些使用例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#每晚的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 |
原文地址:shell-eval&crontab