文章目录
- shell脚本编程
- 条件语句
- 脚本执行多条命令
- 执行定时任务
本文着重于提高我们的生产力,所以将这几个作为了一个专题。
shell脚本编程
脚本中不同语句用分号隔开,和c语言一样。
for, do, done是sh脚本语言的关键字。
在shell脚本开头写上:
#!/bin/bash
“#!”是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行。
变量:定义变量时,变量名不加美元符号($),如:
your_name="qinjx"
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
your_name="qinjx"
echo $your_name#或者
echo ${your_name}
推荐给所有变量加上花括号,这是个好的编程习惯。
字符串:字符串可以用单引号,也可以用双引号,也可以不用引号。
str='this is a string'
单引号字符串的限制:
•单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
•单引号字串中不能出现单引号(对单引号使用转义符后也不行)
双引号条中转义字符只在下面情况生效,单引号什么都不生效。
\$表示$的字面值
\`表示`的字面值
\"表示"的字面值
\\表示\的字面值
除以上情况之外,在其它字符前面的\无特殊含义,只表示字面值。
另外,双引号中可以使用变量。
条件语句
if 条件测试操作
then
命令序列
fi
示例如下:
if [ $a = "男" ]
then
echo "$a 组"
else
echo "女 组"
fi
脚本执行多条命令
比如我们要添加镜像源的时候,要添加很多,那么我们可以使用shell脚本来帮助我们,但是问题在于命令之间用什么来隔开呢?
- 每个命令之间用;隔开
说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,
但不保证每个命令都执行成功。 - 每个命令之间用&&隔开
说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。 - 每个命令之间用||隔开
说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功
一条命令为止。
新建一个文件,随便命名,打开这个文件,我们选择1,然后保存退出,如下:
最后执行:
sh condac.sh##上述名称
发现成功添加了这么多的镜像源:
执行定时任务
执行这种任务,是靠crond服务程序来完成的,所以你得看这个服务程序是否打开,以Centos为例,如下:
systemctl status crond
如果是active的状态,说明可以使用,我们使用crontab工具:
#编辑定时任务:
crontab -e
#默认会进入vi编辑器
其格式
格式:
* * * * * command
分 时 日 月 周 命令
1、crontab -e 回车
2、添加任务,并保存
#每天下午19:00定时关机
55 18 * * * /usr/sbin/shutdown -h 19:00
00 19 * * * /usr/sbin/shutdown now#同上。
* * * * * echo 123#每一秒钟都输出123.
0 */1 * * *#每小时执行。
3、查看任务列表
crontab -l
#查看定时任务执行情况:
tail -f /var/log/cron#看最近情况
cat /var/log/cron#看全部
需要注意一些坑:
- 我用ssh登录的时候,在定时任务里面使用ls打印目录,但是根本不会在我的ssh屏幕上显示!但是这个任务其实是已经执行了的,不信,你可以将ls的输出重定向到文件来验证。类似的还有上述echo这样的,也是。
- ls这种可以不使用ls的绝对路径,我们看到上述使用了
/usr/sbin/shutdown
,这种是绝对路径,一般来说系统内置的命令可以不使用绝对路径,但是你自己安装的一些程序,需要使用绝对路径!!!我就被坑了,比如python test.py
,在命令行中这么用可以,但是在定时任务中不可以,需要填写python的绝对路径。 - 不同定时任务之间,直接换行即可,不需要用;号分隔。
- 你的定时任务中的命令如果不是绝对路径,即/开头的,那么都是Home目录的相对路径,这个也要切记。比如上面的python由于没有写绝对路径,就以为是执行home目录下的python!