第一个shell脚本
需求背景:
公司需要把服务器本地备份的sql数据,备份到另一台ftp服务器上。
需求分析:
1.因本地数据库备份为最近5天的数据集,故需要找到当天的数据文件
2.备份至ftp服务器上,故需要ftp命令。
3.定时任务每天执行
代码一:异地本分脚本
#!/bin/bash
HOST='***'
USERNAME='username'
PASSWORD='password'
#upload file to FTP server
#文件目录(本地工作目录)
DIRECTORY="/home/data/backup/prod/mysql/erp_base_db/"
#获取目录第一个文件名
FIRST_FILE=$(ls -1 "$DIRECTORY" | sort -r | head -n 1)
cd $DIRECTORY
ftp -inv *** <<END_SCRIPT
user $USERNAME $PASSWORD
put $FIRST_FILE $FIRST_FILE
quit
END_SCRIPT
exit 0
代码二:crontab -e 新增定时任务
* * * * * command
第一次脚本困境
一:调试困难
1.根据脚本提示错误,然后在命令行中真对出错的命令调试
二:脚本内的命令运行失败(cd 找不到后面的路径,put 找不到文件.......)
编码问题:
windows下编辑的脚本,所以有可能有不可见字符。脚本文件是DOS格式的。
解决办法
2.1 vim filename
2.2 :set ff
可看到dos或unix的字样,如果的确是dos格式的, 那么用set ff=unix把它强制为unix格式的,,然后存盘退出后就可运行。
三:ftp 命令
3.1:ftp -inv ***
用法: ftp [-Apinegvtd] [hostname]
-A: enable active mode
-p: enable passive mode (default for ftp and pftp)
-i: turn off prompting during mget
-n: inhibit auto-login
-e: disable readline support, if present
-g: disable filename globbing
-m: don't force data channel interface to the same as control channel
-v: verbose mode
-t: enable packet tracing [nonfunctional]
-d: enable debugging
3.2:提示登录:用户名,密码
3.2:脚本内的其他指令
lcd:切换本地工作目录(ftp环境外的工作目录,对比cd)
put A B :推送ftp环境外的A文件到ftp服务器上的工作目录
四: 定时任务
4.1 :crontab -l #查看crontab定时执行任务列表
4.2 :crontab -e #编辑crontab定时执行任务
4.3 :service crond start #启动服务
4.4 :service crond stop #关闭服务
4.5 :service crond restart #重启服务
4.6 :service crond reload #重新载入配置
4.7 :service crond status #查看服务状态
五:Linux $符号的常见用法
5.1用法一:$0, $?等表示各种参数
$0:#bash文件名。
$?:#上一指令的返回值,成功是0,不成功是1。
$1,$2,$3....:#表示命令后接的第几个参数
5.1用法二:${}, 获取变量的值
[root@localhost ~]# a='123'
[root@localhost ~]# echo ${a}
123 #输出
${var_name} 跟光$var_name差不多,
但是用${ }会比较精确的界定变量名称的范围。
5.1用法三:$()
echo "present dir is $(pwd)" #执行括号或者反引号中的命令, 然后返回结果。
present dir is /root # pwd 指向当前目录