envl
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. 再比如:
[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 文件的一些使用例子:
#每晚的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.cnblogs.com/Lynn-Zhang/p/5769403.html