谈谈shell中的eval与crontab命令

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.再比如:

[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

以上就是关于shell中的eval与crontab命令的全部内容,希望本文的内容对大家能有所帮助,如果有疑问欢迎大家留言讨论。

(0)

相关推荐

  • 解析Ubuntu下crontab命令的用法

    cron是一个Linux下的后台进程,用来定期的执行一些任务.因为我用的是Ubuntu,所以这篇文章中的所有命令也只能保证在Ubuntu下有效,但其他系统应该也差不多. 想要让cron执行你指定的任务,首先就要编辑crontab文件.crontab是一个文本文件,用来存放你要运行的命令.你可以以下命令crontab -e  来打开你的用户所属的crontab文件.第一次用这个命令,会让你选择文本编辑器,我选的是vim.选定的编辑器也可以使用select-editor  命令来更改.这点命令行中已

  • Linux命令下crontab命令

    crontab是一个用来设置.删除或显示供守护进程cron执行的定时任务的命令.每一个用户都可以拥有属于自己的定时任务,定时任务文件默认以用户名命名,并放在/var/spool/cron目录,该目录普通用户无访问权限. 可以通过cron.allow 和 cron.deny文件管理用户使用crontab的权限.如果cron.allow存在,用户必须列在其中才会被允许使用cron:如果cron.deny存在,被列在其中的用户禁止使用cron:如果两者都不存在,只有超级用户才能使用cron.在Cent

  • Linux中使用crontab命令启用自定义定时任务实例

    Linux下的定时执行主要是使用crontab文件中加入定制计划来执行,设置比Windows稍微复杂一些(因为没有图形界面嘛),但是也不是非常复杂,有需要的朋友可以了解一下. 一 简介 Linux下的任务调度分为两类,系统任务调度和用户任务调度 系统任务调度:系统需要定期执行的任务,比如重启.日志清理等,其配置文件是:/etc/crontab 用户任务调度:某个用户需要定期执行的任务.用户可以使用 crontab 命令来配置自己的定时任务.所有用户配置的定时任务都存放在 /var/spool/c

  • 使用linux命令crontab间隔时间执行其它命令

    1.1 /etc/crontab 文件 在/etc目录下有一个crontab文件,这里存放有系统运行的一些调度程序.每个用户可以建立自己的调度crontab. 如: 复制代码 代码如下: [root@dave ~]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts 01 * * * * root run-parts /etc/cron.hourly

  • 详解Unix/Linux中周期执行指令Crontab命令

    简介 crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读取和执行. 通常,crontab储存的指令被守护进程激活,crond常常在后台运行,每一分钟检查是否有预定的作业需要执行.这类作业一般称为cron jobs. cron 是 Unix/Linux 中提供定期执行 shell 命令的服务,包括 crond 和 crontab 两部分: crond: cron 服务的守护

  • 谈谈shell中的eval与crontab命令

    eval eval会对后面的命令进行两遍扫描,如果第一遍扫描后,命令是个普通命令,则执行此命令:如果命令中含有变量的间接引用,则保证间接引用的语义.也就是说,eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令.因此,eval命令适用于那些一次扫描无法实现其功能的变量. eval 执行以下两个步骤 第一次,执行变量替换,类似与C语言的宏替代 第二次,执行替换后的命令串 栗子: 1.  有一个名为test的文件,其内容为"Please move on !",定义一个内容是cat

  • 对shell中常见参数及判断命令介绍

    Shell常用特殊变量 经常会在shell命令中,看到$0, $#, $*, $@, $?, $$这样的取值,这些代表什么呢? 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数是$1,第二个参数是$2 $# 传递给脚本或函数的参数个数 $* 传递给脚本或函数的所有参数 $@ 传递给脚本或函数的所有参数.被双引号(" ")包含时,与 $* 稍有不同 $? 上个命令的退出状态,或函数的返回值.成功返回0,失败返回1 $$ 当

  • Android系统在shell中的df命令实现

    当我们在shell中敲击df这条命令的时候,会看到: root@android:/ # df Filesystem Size Used Free Blksize /dev 446.8M 36.0K 446.8M 4096 /mnt/secure 446.8M 0.0 K 446.8M 4096 /mnt/asec 446.8M 0.0 K 446.8M 4096 /mnt/cart0 446.8M 0.0 K 446.8M 4096 /mnt/obb 446.8M 0.0 K 446.8M 40

  • 浅析Shell中的定时任务 crontab

    crondtab定时任务 crondtab是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,crondtab进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务. 如何让shell脚本每天定时执行? 1.新建需要定时执行的shell脚本,这里为date.sh脚本. #!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

  • Shell中变量作用域的介绍与使用命令

    前言 众所周知Shell 中的变量只作用于当前进程.如需在子进程中创建副本可使用 export 内建命令. 有时使用临时变量语法可以非常方便. 变量使用 任何地方都可以定义 Shell 变量,使用 = 分隔变量名和变量值.= 前后不可出现空格,但变量的值可以留空. 读取变量需要添加$前缀. 变量作用域为当前进程. 例如: url=http://harttle.com echo $url export 到子进程 通常变量是不需要 export 的,但是当你需要把一个工作分割成若个小的任务, 分别用

  • 详解 Shell中的grep命令

    用'grep'搜索文本文件 如果您要在几个文本文件中查找一字符串,可以使用'grep'命令.'grep'在文本中搜索指定的字符串.举个例子:假设您正在'/usr/src/linux/Documentation'目录下搜索带字符串'magic'的文件: $ grep magic /usr/src/linux/Documentation/* sysrq.txt:* How do I enable the magic SysRQ key? sysrq.txt:* How do I use the ma

  • Bash Shell中的select命令简单使用示例

    前言 今天刚好写了一个自动化打包脚本,再次使用到了bash shell,好幸福的感觉.这里主要是想介绍一下select命令,这个命令可以帮助我们完成菜单选择功能. 格式 我今天也是第一次使用select流程控制,在php.Java.C这些语言中并没有实现select功能.Bash Shell中,select格式如下: select $var in ${list[@]} do statements that can use $var done 在select执行时,会根据list数组给出选择菜单,

  • Shell中set与shopt命令选项的含义和使用示例

    前言 本文主要给大家介绍了关于Shell中set与shopt命令选项含义与使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. set命令选项 set命令作用主要是显示系统中已经存在的shell变量,以及设置shell变量的新变量值.使用set更改shell特性时,符号"+"和"-"的作用分别是打开和关闭指定的模式.set命令不能够定义新的shell变量.如果要定义新的变量,可以使用declare命令以变量名=值的格式进行定义即可. 内置

随机推荐