前言
最近和服务器频繁打交道,Shell 脚本写的也比较多,记录一波使用。
Shell 介绍
它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。使用它可以更好的在linux上工作,提高效率,可以编写脚本,节省时间。例如在 Linux 写好脚本程序,然后使用 sh 命令 sh xxx``_.sh_ 执行就可以了,非常简单。
Shell 有很多种格式,但一般 Shell 脚本是以 #!/bin/bash 开头(这个非必须,但有时不加会报错)例如在 Unix 环境下,新建 hello.sh
#!/bin/bash# echo 是个关键字,用于输出echo 'Hello World!'
保存然后执行 sh hello.sh 然后在命令行中可以看到 Hello World! 这就是一个简单的 Shell 脚本了。
变量声明
定义变量没有特殊的指令来标记,只需注意变量名的规范性即可,获取变量只需在该变量前面加‘$’符合即可。例如:
#!/bin/bashmsg='Hello World!'# 或者 echo ${msg}echo $msg
变量类型
Shell 中有三种变量类型:
- 环境变量,所有的 Shell 都共享,例如 $JAVA_HOME
- Shell 变量,所有 Shell 共享
- 局部变量,只在该 Shell 文件中共享
常见操作
脚本中执行命令
脚本中执行命令,需要用反引号“``”引起来
# 查询SQLr1 = `mysql -uroot -proot -e "select * from user where id = 1"`echo $1# 获取当前目录所有文件r2 = `ll`echo $r2
字符串
m1='abc'm2='def'# 拼接,输出结果为:abcdefecho $m1$m2# 获取长度,输出结果为:3echo ${#m1}
脚本传参
向文件传递参数,在文件中用 $n 接收,第一个参数就是 $1,第二个就是 $2….,注意的是第一个参数默认就是文件名,$* 显示所有参数,例如:
#这里传了4个参数,分别是 demo.sh 1 2 3sh demo.sh 1 2 3
条件判断
Shell 中 if 的格式为:
# 最后是if的倒写fi结尾表示结束,注意空格if [ condition ]thencommand1elif [ condition ]thencommand2elsecommand3fi# 例如:sh if.sh eat 脚本,那么会输出 eat ...if [ $1 = 'eat' ]thenecho 'eat ...'elif [ $1 = 666 ]thenecho 'i say 666'elseecho 'nothing...'fi
for 循环
for 循环有时直接在命令行就会用到
# 格式for var in item1 item2 ... itemN;docommand1done# 例如: sh for.sh 会把该路径下的所有文件都打印出来#!/bin/bashfor i in `ls`;doecho $idone# 也可以直接在命令行中运行for i in `ls`; echo $i
案例
重启 Java 应用
#!/bin/bashecho '-------------------------ready operating----------------'# ps -ef 找到进程# grep 过滤指定应用名称# awk 按行处理,默认按空格分隔,$2 指定的是取第2个pid=`jps -v | grep "backend-app"| awk '{print $2}'`echo '----------------------------------------pid='$pid# 如果有该进程就kill掉,-n 表示该字符长度不为0[ -n $pid ] && kill -9 $pidnohup java -jar backend-app-v1.0.jar >/home/backend-log.txt &# 睡眠5ssleep 5jpsecho '-------------------------ok!---------'
上传指定名称的文件到服务器
#!/bin/bashecho "请输入文件名:"# 获取控制台输入的变量read filescp "$file" root@192.168.9.3:/home
复杂脚本
如果一个脚本比较复杂,会封装成函数的形式调用
#!/bin/bashstartApp(){echo 'start app ...'}stopApp(){echo 'stop app ...'}restartApp(){echo 'restart app ..'}# 符合条件才调用相应的函数if [ $1 = 'start' ]thenstartAppelif [ $1 = 'stop' ]thenstopAppelif [ $1 = 'restart' ]thenrestartAppelseecho 'nothing'fi
统计频率进行排序
cat test_redis.log# awk 分割| awk -F 'Dec' '{print $2}'| awk '{print $1}'| awk -F ':' '{print $1}'# 在每列的左边显示出现次数| uniq -c# 排序,-r 是倒序| sort -r
