linux之shell脚本

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
done

sum=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]"

}

上一篇:idea git 版本回滚


下一篇:JS数组之map、filter、reduce使用详解