翼度科技»论坛 云主机 LINUX 查看内容

Shell脚本

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
Shell脚本

Shell是什么?


  • Shell脚本语言属于弱类型语言,解析用户输入的命令和程序,使得用户可以与Linux进行交互;
  • 适合处理纯文本类型数据(日志、配置文件、文本、网页文件、大多数纯文本类型的文件)。
Shell概念

shebang


  • 即文件的第一行前两个字符 #!,后面的语句指定命令的解析器。

    • #!/bin/sh 或 #!/bin/bash:执行时会调用/bin/sh,即bash解析器。
    • #!/bin/perl:执行时。
    • #!/usr/bin/python:python解析器。
    • #!/usr/bin/env:跨平台都能正常找到解析器的办法。
    • 注意

      • 未指定shebang时,默认用Shell解析。
      • 当指定shebang,但程序是不可执行文件时,转而用Shell解析。
      • 指定shebang解析器的路径需要绝对路径。
      • 执行时指定解析器执行,会忽略shebang解析器。


变量


  • 命名规则: 只能数字、字母、下划线,不能以数字开头,区分大小写。
  • 数据类型:bash默认所有变量都是字符串。
  • 作用域:只针对当前的Shell进程,每次调用bash/sh解析器执行脚本都会开启一个子Shell。
  • 进程树
  1. # psTree 可以检查进程树
  2. pstree
  3. ps -ef --forest
复制代码
常用命令
  1. # \ 转义
  2. echo "print each param from "\$*""
  3. # 变量定义与赋值之间不得有空格
  4. name="I am Soul!"
  5. # 单引号不识别特别语法,双引号识别特殊符号
  6. name2="${name}"
  7. # 变量替换/引用
  8. echo ${name}
  9. echo $name
  10. # 转义 即 变量中定义命令
  11. name = `ls`
  12. # 1)执行 name 变量时实际上是输出 ls 指令
  13. echo $name
  14. # 常用命令
  15. set                                                                                                                 # 输出所有变量(局部、全局)
  16. unset 变量名                                                                                        # 删除变量/函数
  17. env                                                                                                                 # 输出全局变量
  18. declare                                                                                                        # 输出所有变量
  19. export                                                                                                        # 输出/设置环境变量
  20. export | awk -F '[ :=]' '{print $3}'                                        # 输出系统环境变量关键字
  21. readonly                                                                                        # 设置只读
  22. let                                                                                                    # 数值运算 即 (())
  23. expr                                                                                                # 计算器
  24. expr yn.png ":" ".*"                                                                        # 统计 yn.png 文件字符个数
  25. test -e soul.jpg && echo "OK" || echo "NO"                                # 三目运算
复制代码
环境变量


  • 常用环境变量
  1. ${USER}                                                # 当前用户名字
  2. $UID                                                # 当前用户ID
  3. $HOME                                                # 当前用户文件目录
  4. $(data)                                                # 时间
复制代码

  • 配置文件
  1. # 用户个人配置
  2. ~/.bash_profile               
  3. ~/.bashrc                                        # 远程登录用户特有文件
  4. # 全局配置文件
  5. /etc/profile
  6. /etc/bashrc
  7. /etc/profile.d/                                # 系统建议创建在该目录而非直接修改全局配置文件。
复制代码

  • 环境变量文件加载顺序

特殊变量
  1. # 特殊参数变量
  2. $0                                                                      # 获取Shell脚本文件名,以及脚本路径
  3. $n                                                                      # 获取脚本的第n个参数(n>=1),当大于9时,需要写成 ${10}
  4. $#                                                                      # 获取执行的Shell脚本后面的参数的总数
  5. $*                                                                      # 获取Shell脚本所有参数,加双引号时,将所有参数视为一份数据
  6. $@                                                                      # 获取Shell脚本所有参数,加双引号时,仍然将每个参数视为独立的数据
  7. # 特殊状态变量
  8. $?                                                                       # 上一次执行命令的状态返回值:0:成功,否则失败。
  9. $$                                                                      # 当前Shell脚本的进程号
  10. $!                                                                      # 上一次后台进程的PID
  11. $_                                                                      # 获取上一次执行命令最后一个参数
复制代码
扩展变量
  1. ${parameter:-word}                                      # param参数为空时返回word值
  2. ${parameter:=word}                                      # param参数为空时将word值返回给param参数并作为返回值
  3. ${parameter:?word}                                      # param参数为空时返回word作为提示信息返回
  4. ${parameter:+word}                                      # param参数为空时不做处理,否则返回word
复制代码
bash的内置命令
  1. echo -n                                                               # 不换行输出
  2. echo -e                                                               # 解析字符串中的特殊字符(\n:换行,\r:回车,\t:制表符,\b:退格)
  3. echo $name | wc -l                                                  # 统计有多少行
  4. echo $name | wc -L                                                  # 统计长度
  5. echo "8.8*2" | bc                                                  # 执行 bc 运算
  6. eval ls;cd /tmp                                                          # 执行多个命令
  7. exec                                                                      # 不创建子进程,执行后续命令,且执行完毕后自动退出
  8. seq                                                                          # 生成序列指令
  9. seq -s ":" 10                                                          # 生成 1~10的序列并用分号隔开
  10. time                                                                       # 计算执行时间
  11. read -t 5 -p "请输入:"                                          # 提示用户,输入信息(-p),-t 超时时间
  12. # 运算
  13. # 1) 求和运算
  14. echo {1..100} | tr " " "+" | bc                          # 求和运算
  15. echo $((`seq -s "+" 100`))                                  # (())
  16. seq -s " + " 100 | xargs expr                          # xargs expr
  17. # 2)awk方式运算
  18. echo "3.2 2.2" | awk '{print $1+$2}'
  19. # 测试
  20. test                                                                
  21. [  ]                                                                      # 也可以用中括号 [  ] 代替test,前后必须有空格,变量必须用""
  22. test -e a.txt -a -f a.txt                                  # -a 即: and && 条件
  23. test -e a.txt -o -f a.txt                                  # -o 即: or || 条件
  24. # 1) 文件相关
  25. test -e                                                               # 文件是否存在
  26. test -f                                                               # 是否为文件
  27. test -d                                                                      # 是否为目录
  28. test -r                                                                      # 文件是否有[可读]属性
  29. test -w                                                                      # 文件是否有[可写]属性
  30. test -x                                                                      # 文件是否有[可执行]属性
  31. # 2)字符串
  32. test -z                                                                      # 字符串为空时为真,否则为假。
  33. test -n                                                               # 字符串为空时为假,否则为真。
  34. # 3)比较
  35. test -eq                                                              # 两个数值相等
  36. test -nq                                                              # 两个数值不相等
  37. test -gt                                                              # a 大于 b
  38. test -lt                                                              # a 小于 b
  39. test -ge                                                              # a 大于等于 b
  40. test -le                                                              # a 小于等于 b
  41. test =                                                                      #
  42. test !=                                                                      #
  43. test !                                                                      #
复制代码
shell子串
  1. ${name}                                                                      # 返回变量值
  2. ${#name}                                                              # 返回变量长度,字符串长度
  3. ${name:start}                                                          # 从第几位截取返回子字符串
  4. ${name:start:length}                                          # 从第几位开始,长度为length进行截取
  5. ${name#word}                                                          # 从变量开头删除最短的word字符串
  6. ${name##word}                                                          # 从变量开头删除最长word字符串
  7. ${name%word}                                                          # 从变量结尾删除最短的word字符串
  8. ${name%%word}                                                          # 从变量结尾删除最长的word字符串
  9. ${name/pattern/string}                                          # 用string替换第一个匹配的pattern
  10. ${name//pattern/string}                                          # 用string替换所有的pattern
  11. # 统计子串长度
  12. echo ${#name}                                                          # 返回长度(最快)
  13. echo $name | wc -l                                                  # wc 统计有多少行
  14. echo $name | wc -L                                                  # wc 统计长度
  15. expr length "${name}"                                          # expr 计算数值
  16. echo $name | awk '{print length($0)}'          # awk 统计长度,length函数
复制代码
执行方式
  1. # 进程列表,并在子进程运行
  2. (cd ~;pwd;ls;cd /tmp/;pwd;echo $BASH_SUBSHELL)
  3. # 利用()括号开启子进程执行命令,$BASH_SUBSHELL检查当前进程层数(子进程大于1),常用于多进程处理提高程序并发执行的效率。
  4. # 方式一(常用): 文件没有执行权限 或 脚本没有指定 shebang 都可以执行,会开启子进程执行Shell(获取不了当前进程的变量)
  5. bash script.sh
  6. sh script.sh
  7. # 方式二:绝对/相对路径执行脚本,需要文件含有X权限。
  8. bash /usr/script.sh
  9. bash .script.sh
  10. # 方式三:不会开启子进程执行Shell,可以获取当前进程的变量。
  11. source script.sh
  12. . script.sh
  13. # 方式四:
  14. sh < script.sh
复制代码
Shell脚本应用

批量操作文件名
  1. # 批量创建文件
  2. touch soul_config{1..2}.xml
  3. # 批量修改文件名
  4. for item in `ls *config.xml`                                        # 获取当前目录下部分后缀的文件名
  5. do mv $item `echo ${item//config/}`                                # 将config文件名替换为空
  6. done
复制代码
数据备份并删除过期数据
  1. # find xargs
  2. find ${dir_path:=/data/mysql_back_data/} -name '*.tar.gz' -type f -mtime +7 | xargs rm -f
  3. # 避免dir_path为空时取指定路径下的数据
复制代码
运算脚本开发
  1. #!/bin/bash/
  2. # 开发一个 运算脚本
  3. # 定义打印函数
  4. print_soul(){
  5.         printf "Please enter an interger!\n"
  6.         exit 1
  7. }
  8. # 接收用户输入的第一个数字
  9. read -p "Please input your number: " firstnum
  10. # [] 中括号前后必须有空格
  11. # -n 判断条件是否为空字符串
  12. # sed 将所有数字替换为空
  13. if [ -n "`echo $firstnum|sed 's/[0-9]//g'`" ]; then
  14.         print_soul
  15. fi
  16. # 接收用户输入的 运算符
  17. read -p "Please input your operator:" operator
  18. if [ "${operator}" != "+" ] && [ "${operator}" != "-" ] && [ "${operator}" != "/" ] && [ "${operator}" != "*" ]; then
  19.         echo "只允许 输入 + | - | * | /"
  20.         exit 2
  21. fi
  22. # 接收用户输入的第二个数字
  23. read -p "Please input your number: " sencondnum
  24. if [ -n "`echo ${sencondnum} | sed 's/[0-9]//g'`" ]; then
  25.         print_soul
  26. fi
  27. # 运算
  28. echo "${firstnum}${operator}${sencondnum}结果是:" $((${firstnum}${operator}${sencondnum}))
复制代码
Nginx存活检测
  1. #!/bin/bash/
  2. # 失败次数
  3. fails=0
  4. success=0
  5. # 空转检查
  6. while true
  7.         do
  8.                 # 请求网站是否能打开
  9.                 wget --timeout=5 --tries=1 http://baidu.com/ -q -0 /dev/null
  10.                 # -ne 不等于
  11.                 if [ $? -ne 0 ]; then
  12.                         let fails=fails+1
  13.                 else
  14.                         let success+=1
  15.                 fi
  16.                 # -ge 大于,网站正常
  17.                 if [ $success -ge 1 ]; then
  18.                         echo "The inter site is Ok!!!"
  19.                         exit 0
  20.                 fi
  21.                 # -ge 大于,网站异常、并发送邮件
  22.                 if [ $fails -ge 2 ]; then
  23.                         mail -s "`date +%F-%T`" 16042334@qq.com "The inter site is fails!!!"
  24.                         exit 2
  25.                 fi       
  26. done
复制代码
Mysql存活检测
  1. #!/bin/bash/
  2. # netstat、ss、lsof 三种方式检查Mysql是否运行、失败即发送邮件提醒。
  3. # 邮件发送,需要配置:vim /etc/mail.rc,配置发送者的账号信息
  4. if [ `netstat -tunlp | grep mysql | wc -l` != "1" -a `ss -tunlp | grep mysql | wc -l` -nq "1" -a `lsof -i tcp:3306 | wc -l` = "0" ];then
  5.         mail -s "`date +%F-%T`" 16042334@qq.com "The mysql is stopped!!!"
  6. fi
复制代码
Mysql备份
  1. #!/bin/bash/
  2. DATE=$(date +%F_%H-%M-%S)
  3. HOST=localhost
  4. USER=backup
  5. PASS=123.com
  6. BACKUP_DIR=/data/db_backup
  7. DB_LIST=$(mysql -h$HOST        -u$USER -p$PASS -s -e "show databases;" 2> /dev/null | egrep -v "Database|information_schema|mysql|performance_schema|sys")
  8. for item in $DB_LIST; do
  9.         BACKUP_NAME=${BACKUP_DIR}/${DB}_${DATE}.sql
  10.         if ! mysqldump -h$HOST        -u$USER -p$PASS -B $DB > ${BACKUP_NAME} 2> /dev/null;then
  11.                 echo "$BACKUP_NAME is Backup failed !!!"
  12.         fi
  13. done
复制代码
来源:https://www.cnblogs.com/soul-Q/p/17464709.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具