前言

最近和服务器频繁打交道,Shell 脚本写的也比较多,记录一波使用。

Shell 介绍

它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。使用它可以更好的在linux上工作,提高效率,可以编写脚本,节省时间。例如在 Linux 写好脚本程序,然后使用 sh 命令 sh xxx``_.sh_ 执行就可以了,非常简单。

Shell 有很多种格式,但一般 Shell 脚本是以 #!/bin/bash 开头(这个非必须,但有时不加会报错)例如在 Unix 环境下,新建 hello.sh

  1. #!/bin/bash
  2. # echo 是个关键字,用于输出
  3. echo 'Hello World!'

保存然后执行 sh hello.sh 然后在命令行中可以看到 Hello World! 这就是一个简单的 Shell 脚本了。

变量声明

定义变量没有特殊的指令来标记,只需注意变量名的规范性即可,获取变量只需在该变量前面加‘$’符合即可。例如:

  1. #!/bin/bash
  2. msg='Hello World!'
  3. # 或者 echo ${msg}
  4. echo $msg

也可以在命令行中看到 Hello World!。
**

变量类型

Shell 中有三种变量类型:

  1. 环境变量,所有的 Shell 都共享,例如 $JAVA_HOME
  2. Shell 变量,所有 Shell 共享
  3. 局部变量,只在该 Shell 文件中共享

常见操作

脚本中执行命令

脚本中执行命令,需要用反引号“``”引起来

  1. # 查询SQL
  2. r1 = `mysql -uroot -proot -e "select * from user where id = 1"`
  3. echo $1
  4. # 获取当前目录所有文件
  5. r2 = `ll`
  6. echo $r2

字符串

  1. m1='abc'
  2. m2='def'
  3. # 拼接,输出结果为:abcdef
  4. echo $m1$m2
  5. # 获取长度,输出结果为:3
  6. echo ${#m1}

脚本传参

向文件传递参数,在文件中用 $n 接收,第一个参数就是 $1,第二个就是 $2….,注意的是第一个参数默认就是文件名,$* 显示所有参数,例如:

  1. #这里传了4个参数,分别是 demo.sh 1 2 3
  2. sh demo.sh 1 2 3

条件判断

Shell 中 if 的格式为:

  1. # 最后是if的倒写fi结尾表示结束,注意空格
  2. if [ condition ]
  3. then
  4. command1
  5. elif [ condition ]
  6. then
  7. command2
  8. else
  9. command3
  10. fi
  11. # 例如:sh if.sh eat 脚本,那么会输出 eat ...
  12. if [ $1 = 'eat' ]
  13. then
  14. echo 'eat ...'
  15. elif [ $1 = 666 ]
  16. then
  17. echo 'i say 666'
  18. else
  19. echo 'nothing...'
  20. fi

for 循环

for 循环有时直接在命令行就会用到

  1. # 格式
  2. for var in item1 item2 ... itemN;
  3. do
  4. command1
  5. done
  6. # 例如: sh for.sh 会把该路径下的所有文件都打印出来
  7. #!/bin/bash
  8. for i in `ls`;
  9. do
  10. echo $i
  11. done
  12. # 也可以直接在命令行中运行
  13. for i in `ls`; echo $i

案例

重启 Java 应用

  1. #!/bin/bash
  2. echo '-------------------------ready operating----------------'
  3. # ps -ef 找到进程
  4. # grep 过滤指定应用名称
  5. # awk 按行处理,默认按空格分隔,$2 指定的是取第2个
  6. pid=`jps -v | grep "backend-app"| awk '{print $2}'`
  7. echo '----------------------------------------pid='$pid
  8. # 如果有该进程就kill掉,-n 表示该字符长度不为0
  9. [ -n $pid ] && kill -9 $pid
  10. nohup java -jar backend-app-v1.0.jar >/home/backend-log.txt &
  11. # 睡眠5s
  12. sleep 5
  13. jps
  14. echo '-------------------------ok!---------'

上传指定名称的文件到服务器

  1. #!/bin/bash
  2. echo "请输入文件名:"
  3. # 获取控制台输入的变量
  4. read file
  5. scp "$file" root@192.168.9.3:/home

复杂脚本

如果一个脚本比较复杂,会封装成函数的形式调用

  1. #!/bin/bash
  2. startApp()
  3. {
  4. echo 'start app ...'
  5. }
  6. stopApp()
  7. {
  8. echo 'stop app ...'
  9. }
  10. restartApp()
  11. {
  12. echo 'restart app ..'
  13. }
  14. # 符合条件才调用相应的函数
  15. if [ $1 = 'start' ]
  16. then
  17. startApp
  18. elif [ $1 = 'stop' ]
  19. then
  20. stopApp
  21. elif [ $1 = 'restart' ]
  22. then
  23. restartApp
  24. else
  25. echo 'nothing'
  26. fi

统计频率进行排序

  1. cat test_redis.log
  2. # awk 分割
  3. | awk -F 'Dec' '{print $2}'
  4. | awk '{print $1}'
  5. | awk -F ':' '{print $1}'
  6. # 在每列的左边显示出现次数
  7. | uniq -c
  8. # 排序,-r 是倒序
  9. | sort -r