在Linux系统中,shell特别擅长系统管理任务,可以作为一种编程语言来自动化某些任务或者传递参数。大部分的任务都是在shell脚本下完成的
1.建立脚本
为了方便识别脚本是shell脚本,我们一般以.sh作为shell脚本的后缀名。
vim script.sh
然后程序必须以下面的行开始(必须放在文件的第一行):
#!/bin/sh
在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。注释内容是不会执行的。
要赋值给一个变量,可以这样写: 变量名=值
取出变量值可以加一个美元符号($)在变量前面:
#!/bin/sh
#对变量赋值:
a="hello world"
# 现在打印变量a的内容:
echo "A is:"
echo ${a}
然后运行
sh script.sh
这个脚本将会输出:
A is:
hello world
Unix命令
在shell脚本中可以使用任意的Unix命令,以下这些命令通常是用来进行文件和文字操作的。
#将文字内容打印在屏幕上
echo "XXX"
#计算文件行数
wc –l file
#计算文件中的单词数
wc –w file
#计算文件中的字符数
wc -c file
#文件拷贝
cp 源文件 目标目录
#重命名文件或移动文件
mv oldname newname
#删除文件
rm -rf filename
#在文件内搜索字符串
grep '搜索内容' file.txt
管道、重定向
管道 (|) 将一个命令的输出作为另外一个命令的输入。
grep "hello world" file.txt | wc -l
在file.txt中搜索包含有”hello world”的行并计算其行数。在这里grep命令的输出作为wc命令的输入。
重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。
流程控制
"if" 表达式 如果条件为真则执行then后面的部分:
if ....; then
....
elif ....; then
....
else
....
fi
通常用" [ ] "来表示条件测试。注意这里的空格很重要。要确保方括号的空格。下面这段代码经常作为例行化脚本的开头。
#如果手动输入参数个数为一个
if [ "$#" == "1" ];
#将手动输入的参数赋值给yestoday
then
yesterday=$1
#否则取当前系统时间减一天赋值给yestoday
else
yesterday=$(date -d "-1 day" +"%Y-%m-%d")
fi
#这样执行会将2019-04-01赋值给yesterday
sh lingxing.sh 2019-04-01
#这样执行会将真实的昨天日期赋值给yesterday
sh lingxing.sh
crontab定时任务
常用的命令
crontab -l 列出当前用户的crontab
crontab -e 编辑当前用户的crontab,默认使用vi,上一篇博客介绍的vim的各种操作在此同样适用
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * command to be executed
五个分别代表 每小时的第几分钟、每天的第几个小时、一个月中的第几天,一年中的第几个月、一周中的第几天。五个后面跟要执行的命令即可。
星号()表示取值范围内的所有值。例如,在hour的位置,表示每小时执行一次,依此类推。
连字符(-)表示一个范围。例如,8-10表示8、9、10。
逗号(,)表示分割指定的数值。例如:3,5-8,12表示3,5,6,7,8,12。
正斜杠(/)表示步进值。例如,分钟的位置为*/5,表示每五分钟执行一次。
如下实例
#每天9点20分执行该脚本,所有日志重定向到/dev/null,注意脚本要写绝对路径
20 9 * * * sh /root/script.sh >/dev/null 2>&1
#每周一9点20分执行该脚本
20 9 * * 1 sh /root/script.sh >/dev/null 2>&1
#每月一日9点20分执行该脚本
20 9 1 * * sh /root/script.sh >/dev/null 2>&1
#每天每小时整执行该脚本
0 * * * * sh /root/script.sh >/dev/null 2>&1
#每五分钟执行一次该脚本
*/5 * * * * sh /root/script.sh >/dev/null 2>&1
#每个工作日的8到20点每小时整执行该脚本
0 8-20 * * 1-5 sh /root/script.sh >/dev/null 2>&1
-
/dev/null
这条命令的作用是将标准输出1重定向到/dev/null中。 /dev/null代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”。那么执行了>/dev/null之后,标准输出就会不再存在,没有任何地方能够找到输出的内容。
- 2>&1
这条命令用到了重定向绑定,采用&可以将两个输出绑定在一起。这条命令的作用是错误输出将和标准输出同用一个文件描述符,说人话就是错误输出将会和标准输出输出到同一个地方。
linux在执行shell命令之前,就会确定好所有的输入输出位置,并且从左到右依次执行重定向的命令,所以>/dev/null 2>&1的作用就是让标准输出重定向到/dev/null中(丢弃标准输出),然后错误输出由于重用了标准输出的描述符,所以错误输出也被定向到了/dev/null中,错误输出同样也被丢弃了。执行了这条命令之后,该条shell命令将不会输出任何信息到控制台,也不会有任何信息输出到文件中。
image.png版权声明:本文为CSDN博主「风影楼前」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_23897391/article/details/89129899
网友评论