Shell脚本基本指令学习
1.我的shell处---helloworld
shell文件内容的第一句:
#!/bin/bash #表明我们的shell用bash解析!!! echo “helloworld” #保存 执行。确保文件具有可执行权限!
有执行权限 直接 ./文件 执行
若无可执行权限,可用sh ./文件 执行
单行注释用 #语句 多行注释用 :<<[符号] 语句 [符号] 例如:<<! 语句1 语句2 !
2.shell的变量
系统变量和自定义变量
显示当前shell所有变量 shell
基本语法:
- 定义变量:变量=值
- 撤销变量:unset 变量
- 生命静态变量:readonly 变量,注意:不能unset
定义变量规则
- 变量名字母、数字、下划线,但不能以数字开头
- 等号两侧不能有空格
- 变量名一般习惯大写
将命令的返回值赋给变量
1.A=`ls -la` 反引号,结果返回 2.A=$(ls -la) 等价于反引号
设置环境变量
基本语法
1.export 变量名=变量值 shell变量输出为环境变量
2.source 配置文件 使修改后配置文件生效
3.echo $变量名 查询环境变量值
注:环境变量可在其他shell文件中使用。
位置参数变量
基本语法
- 0代表命令本身, 9代表第1-9个参数,第10个用$(10) )
- $* (代表命令行所有参数 )
- *含义相同, 但将每个参数区分对待 )
- $# (代表参数个数 )
预定义变量
基本语法
- $$ (当前进程的PID号 )
- $! (后台运行的最后一个进程的进程号 )
- $? (最后依次执行的命令的返回状态,0证明正确;非0,执行不正确)
3.运算符
运算操作的基本语法
- “[运算式]”
- expr m + n #注意此方式下:符号左右有空格
4.条件判断
基本语法
[ condition(条件) ] #条件两端有空格哦~
非空返回true,可使用$?验证,(0true,>1false)
常用判断条件
注意:比较符号 两端也有空格!!!
- 两个整数的比较
- -lt 小于
- -le 小于等于
- -eq 等于
- -gt 大于
- -gl 大于等于
- -ne 不等于
- 字符串比较 =
- 按照文件读写权限判断
- -r 读权限
- -w 写权限
- -x 执行权限
- 可组合 如-rwx
- 按照文件类型进行判断
- -f 文件存在且是一个常规文件
- -e 文件存在
- -d 文件存在且是一个目录文件
5.流程控制
if 判断
基本语法
if[ condition ];then #在同一行需加分号 程序 fi 或者 if[ condition ] then 程序1 elif[ condition ] then 程序2 fi
case 语句
基本语法
case $变量名 in "值1") 程序1 #若变量=值1,执行程序1 ;; #结束符两分号 "值2") 程序2 #若变量=值2,执行程序2 ;; .....省略其他分支 *) 程序n #相当于default时执行 ;; esac #case的结束符为他的反写
for 循环
基本语法1
for 变量 in 值1 值2 值3... #意思为 将值1,值2,值3依次赋予i进行do do 程序 done #这里for结束不是rof反写哦!
基本语法2
for ((初始值;循环控制条件;变量变化)) #与c/c++相似 do 程序 done
while 循环
基本语法
while [ condition ] #注意while后有个空格 条件两端也有空格哦! do 程序 done
read读取控制台输入
基本语法
read (选项) (参数) 选项: -p:指定读取值时的提示符,即提示语句“这个是什么”之类 -t:指定等待时间内输入(秒),若未输入,不等待 参数: 变量:指定读取值的变量名
函数
系统函数
- basename 函数
功能:返回路径最后 /的部分,常用于获取文件名,可将文件名后缀不显示
basename[pathname][suffix]
basename[string][suffix] #字符串显示
选项:
suffix为选项后缀,若指定,则函数会将pathname或string中的suffix去掉 - dirname 函数
功能:返回路径最后一个/的前面的部分,常用于返回路径
dirname[path/file] #返回path
自定义函数
基本语法
function funname()
{
action;
[return int;] #[]内可不写
}
调用直接写函数名: funname 值
综合实例
- 需求分析
- 每天凌晨2:10备份数据库atguiguDB到/data/backup/db
- 备份开始和结束给出对应提示信息
- 备份后文件以备份时间为文件名,打包为.tar.gz形式
- 备份同时,检查是否有10天前备份的数据库文件,有就删除。
- 代码实现示例 #!/bin/bash #完成数据库的定时备份 #分析分为两步,备份脚本+crontab任务添加 #备份路径变量 BACKUP=/data/backup/db #当前时间变量 DATETIME=$(date +%Y_%m_%d%H%M%S) #调试可以log,即插入echo语句,采用大括号括变量 为了分辨清楚,与不加相同。 #echo ${DATETIME} #条件判断,相当于if xxx;若不存在此路径,创建此路径;&&作用 #mkdir -p 创建多级目录 [ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME" #备份开始提示信息 echo "====Start BackUp====" echo "===path is $BACKUP===" #主机名变量 HOST=localhost #用户名 DB_USER=root #密码 DB_PWD=root #数据库名变量 DATABASE=atguiguDB #备份数据库mysqldump,需装mysql #| gzip 对备份的文件进行gzip压缩操作 > 流入(放置) xxx/xxx/xxx.gz mysqldump -u${DB_USER} -p${DB_PWD} --host${HOST} ${DATEBASE} | gzip >$BACKUP/$DATETIME/$DATETIME.sql.gz #路径更改 cd $BACKUP #tar打包此文件 tar -zcvf $DATETIME.tar.gz #有了打包,删除打包前的文件夹 rm -rf "$BACKUP/$DATETIME" #删除10天前创建的文件包 #-mtime +10 找10天前创建或修改的文件 #-exec 找到的文件进行其之后command操作 {}代表找到的所有 \;代表结束 find $BACKUP -mtime +10 -name *.tar.gz -exec rm -rf {} \; #提示备份结束 echo "====BackUp End====" :<<! #这是一个sh脚本,需将其加入crontab中按时间计划执行 #将此shell保存为mysql_backup.sh;路径为/usr/sbin #不要忘了给文件加入-x权限! #命令行操作 crontab -e #进入vim窗口输入 10 2 * * * /usr/sbin/mysql_backup.sh #保存退出即可 !