写一个简单的shell 并定时执行遇到的问题与总结

下面是本小白写一个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打开程序文件,删除制定的任务即可

你可能感兴趣的:(写一个简单的shell 并定时执行遇到的问题与总结)