shell脚本
应用场景:重复工作;自动化运维;定时任务;管理集群
shell(外壳)就是一个命令行解释器,提供了一个向linux内核发送请求以便运行程序的界面系统级程序,用户可以使用shell启动、挂起、通知、编写程序
crond任务调度
crontab进行定时任务设置
任务调度指系统在某个时间执行的特定的命令或程序
1、系统工作(循环定时)。如病毒扫描
2、用户工作。如数据库备份
crontab [-elr]: -e 编辑,-l 查询,-r 终止删除所有当前用户任务
service crond restart:重启任务调度
任务调度文件: /etc/crontab
crontab -e
bash>> ll /home >> /testfile/testlog.txt (vim xxx.sh)
bash>> chmod 744 xxx.sh (添加一个可执行权限)
bash>> crontab -e
bash>> */1 * * * * task.sh
总而言之,就是写脚本,赋权限,执行
shell执行
编写shell脚本文件:xxx.sh
执行脚本:sh/bash xxx.sh ——sh->bash 软链接
/bin/bash xxx.sh //这种方式无须执行权
bash>>chmod ugo+x xxx.sh
bash>>..../xxx.sh //路径方式需要获取执行权
>>source xxx.sh //特殊脚本,如激活文件脚本,安装脚本等
shell编写
注释
! xxxx
多行注释 : :<<! xxxx !
引号
反引号 包裹命令 等价于$()
单引号 包裹字符串,不用转义,代价就是无法包裹变量
双引号 包裹变量+字符串,需要转义
$
变量
显示所有变量:set,env
score=10 //不允许空格
readonly score=10 //只读变量,不允许改值
unset var //撤销变量,无法撤销只读变量
设置环境变量:(环境变量可通用)
export var //输出变量为环境变量,临时性的,shell关闭就失
source file //刷新配置文件,让配置生效
常见环境变量:$HOME $USER $PWD $PATH
环境变量
env 查看所有环境变量
cat /proc/$PID/environ 查看正在运行的进程正在使用的环境变量
$ pgrep procname 查看运行中的进程的PID
数组
bash shell只支持一维数组
空格隔开,下标以0开始
my_array=(1 2 3 4)
索引: ${my_array[0]}
赋值: my_array[0]=xxx
长度:${#my_array[*]} //${#my_array[@]}
遍历:${my_array[*/@]}
字符串
长度 : echo ${#string}
提取子串:echo ${string:begin:end}
查找子串:echo `exrp index ${srting} subs``
shell传参!!!
$n : 第n个参数 当n>=10是,需要用${n}获取参数
$# 参数个数
$* 横排整体
$@ 竖排分区
预定义变量
$? 是否执行成功 结果:0 执行成功,否则失败
$$ 脚本当前的PID,可以杀死脚本
$! 后台运行的最后一个进程PID
$- 显示shell使用的当前选项,类似set命令
引入外部文件(的变量)
. file: 加空格
source file
引入外部文件(脚本)可以将数据源和业务分离;实现代码复用,增加可扩展性
读取控制台输入
read -p tip -t seconds var:读取控制台输入并赋值给变量。-p 提示,-t 延时
控制台/终端打印
echo [-e]
printf
echo默认打印换行;printf默认打印不换行。
前者对引号的应用是一致的
printf 沿袭了C语言的输出方式,具备格式化输出
%s %c %d %f都是格式替换符
printf “dfvdfd %d” 2 ——> dfvdfd 2
打印彩色输出(转义实现)
重置-0 黑色-30 红色-31 绿色-32 黄色-33 蓝色-34 洋红-35 青色-36 白色-37 // 设置字体颜色
重置-0 黑色-40 红色-41 绿色-42 黄色-43 蓝色-44 洋红-45 青色-46 白色-47 // 设置文本背景
echo -e "\e[1;31m this is a red text \e[0m"
echo -e "\e[1;41m this is a red text \e[0m"
运算
算数运算
shell不支持原生运算,一般通过expr关键字实现运算,且运算符前后空格隔开,避免被识别为字符串。(乘法*需要转义)
也可以使用$(()),$[]实现 (乘法无须转义)
echo $score
echo `expr 1 + 1``
echo $((1 + 1)) (())可以用于for循环
echo $[1 + 2] []可以用于条件判断,但是比较符特殊
比较/逻辑运算
-eq -ne -lt -gt -le -ge
-a -o !
文件运算
-d 是否目录;-e 文件存在 ; -f 是否存在且是常规文件
-r -w -x 是否有相关权限
-f file
字符串运算
== !=
随机值
系统变量$RANDOM,默认范围0-32767
取0-25:$(($RANDOM%26))
取1-25:$(($RANDOM%25+1))
取10-25:$(($RANDOM%14+10))
正则表达式
匹配、筛选、检索、替换等
grep,sed,awk等命令均支持正则表达式
^.*[]\$
shell判空
shell中经常会接触到“空”的数据,在shell中对空数据的判断主要有
if [! -n "$param" ]
if [ ! $param ]
if [ "$param" = "" ]
if test -z "$param"
流程控制
选择/分支
if [ condition ]
then
command
elif [ condition ]
then
command
else
command
fi //如果写一排,用;隔开
/bin/bash
echo "输入年龄:$1"
if [ $# -ne 1 ] //加空格隔开
then
echo "no args"
elif [ $1 -gt 18 ]
echo "> 18“
fi
case var in
var1)
command
;;
var2)
command
;;
..
**esac ** //一般用于写启动脚本
!/bin/bash
sta=$1
case $1 in
start)
echo "开启防火墙"
;;
stop)
echo "关闭防火墙"
;;
status)
echo "获取防火墙状态"
;;
*)
echo "输入参数有问题"
;;
esac
循环
for file in .... //item1 item2 ...
do
echo $file
done
for((i=1;i<10;i++))
do
command
done
for file in `ls /testfile/``
do
echo $file
donesum=0
for((i=0;i<=100;i++))
do# sum=$[ sum + i ]
sum=`expr $sum + $i`
done
echo $sum
while [ condition ]
do
command
done
while [ $i - 1 ]
# echo $i
echo -ne "$i " i=$[ $i - 1 ]
do
echo $i
i=$[ $i - 1 ]
done
select var in ...:
do
command
break
done
select是bash的扩展应用,适合交互式场合,用户可以从一组不同的值中选择。但是select是一个无限循环,需要使用break跳出或exit跳出/终止
select var in "linux" "sd" "sdsd":
do
break;
done
函数
系统函数
basename dir [suffix]:返回完整路径最后/的部分,常用于获取文件名
basename /home/aaa/bbb.txt ——bbb.txt
basename /home/aaa/bbb.txt .txt ——bbb
dirname dir:获取完整目录的非文件目录,与上面相反
自定义函数
function funname()
{
action;
[return int;]
}
调用直接写函数名: funname[var]
getSum()
{
read "print a:" a
read "print b:" b
echo "sum is $[$a + $b]"
}