下面是本小白写一个shell 脚本并定时执行时遇到的种种问题:
Linux 下执行 .sh 文件提示permission denied
chmod 命令:改变权限
chmod 777 *.sh
777: 第一个7代表文件所属者的权限,第二个7代表文件所属者所在组的权限,第三个7代表其它用户的权限
+ 增加权限
x 执行
chmod +x *.sh 增加该文件的可执行权限
改变文件的权限之后执行 ./*.sh 即可运行该脚本
执行脚本报错:syntax error: unexpected end of file
这个问题因为.sh文件的格式引起的。在windows中编写的文件默认格式为dos, 但是linux 只能执行格式为unix 的脚本。
doc与unix 格式的不同点“dos/window下按一次回车键实际上输入的是“回车(CR)”和“换行(LF)”,而Linux/unix下按一次回车键只输入“换行(LF)””
解决办法:
1. 打开文件直接输出 :set ff (该命令可以查看当前文件的格式)
2. 将当前文件的格式改为unix :set ff=unix (:set ff=doc 可以将当前文件格式改为unix)
3. 查看当前文件格式 :set ff
shell 获取当前日期,当前时间
cur_date="`date +%Y-%m-%d`" (这里注意等号前面不能有空格,`` 这个符号一定不能用错,键盘上英文字符模式下,数字1 前面的那个字符)
这里时间具体的格式,自己可以进行修改,调整
shell脚本变量的定义和使用
普通变量
注意事项:
变量名以英文字母或者下划线开头,但是不能以数字开头
变量名区分大小写
变量名与等号之间,等号与变量值之间不要有空格
使用$加变量名来使用变量的值
如果一行只有一条命令,则每一行不用以分号结尾,每一条命令以换行分隔
如果一行有多条命令,则每一条命令以分号分隔,但建议每行只有一条命令
读取变量的值时最好使用${name} 的格式
从用户键盘读取数据并复制给变量,使用:read [-p "提示信息"] 变量名
输出变量: echo ${变量名}
预定义变量
预定义变量名 |
含义 |
$0或者${0} |
当前执行的进程名/脚本名/程序名 |
$#或者${#} |
命令行中位置参数的总数量 |
$*或者${*} |
所有位置参数的内容 |
$?或者${?} |
上一条命令执行的返回结果,0表示正常,1表示异常或出错 |
单引号和双信号的区别
name="hello"
echo one,“$name” one,hello 双引号括起来的变量名可以解析
echo one,'$name' one,$name 单引号括起来的变量名不可以解析
转义字符在单引号和双引号中都不会转义
echo one,"$name\t zzz" one, hello\t zzz
echo one,'$name\t zzz' one, $name\t zzz
反引号(`)的作用是将反引号括起来的命令(括起来的内容会被当成命令执行),然后将结果赋值给一个变量
shell基本命令
ps aux 显示系统全部进程 (a u x e f 都是一些参数)
grep *** 从标准输入读取字符流,输出包含字符串***的行
grep -v *** 从标准输入读取字符流,输出不包含字符串***的行
wc -l 从标准输入读取字符流,输出行数
kill *** 根据进程号杀死某个进程
eg:ps -fe | grep http | grep -v grep
如果返回0 ,表示进程存在
id 显示用户表示以及用户所属的用户组
who 显示登录到机器上的用户
whoani 显示当前终端上使用的用户
users 查看当前登录的用户
find 查找文件
grep 搜索文件中匹配符
df 显示磁盘空间
mailx 查看自己的电子邮件
shell的if else 语句
if ***; then
***
else ***; then
***
else
***
fi
[ ] 表示测试条件(这里注意包确保方括号的空格)
-ne: 比较两个参数是否不想等
-eq: 比较两个参数是否相等
-lt: 参数1是否小于参数2
-le: 参数1是否小于等于参数2
-gt: 参数1是否大于参数2
-ge: 参数1是否大于等于参数2
-f: 检查某文件是否存在if [ -f "filename" ]
d: 检查文件目录是否存在
if [ $? -ne 0 ]
$? 或者${?} 表示上一条,命令执行的返回结果,0表示正常,1表示异常或者出错
使用crontab 设置脚本定时执行
编辑定制执行命令:crontab -e
格式:定时执行的时间 shell脚本所在的目录以及脚本名称
eg:*/5 * * * * /home/test/*.sh
查看定时执行命令:crontab -l
每五分钟执行:*/5 * * * *
每小时执行: 0 * * * *
每天执行: 0 0 * * *
每周执行: 0 0 * * 0
每月执行: 0 0 1 * *
每年执行: 0 0 1 1 *
如何取消定时执行脚本呢?
使用crontab -e打开程序文件,删除制定的任务即可