centos shell脚本

查看shell

$ cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh

centos7的Linux启动过程

  • BIOS-MBR-BootLoader(grub)-kernel-systemmd-系统初始化-shell

管道和管道符

  • 管道和信号一样,是进程通信的方式之一
  • 匿名管道(管道符)是shell编程常用的通信工具
  • 管道符是“|”,将前一个命令执行的结果传递给后面的命令

重定向符号

  • 一个进程默认会打开标准输入、标准输出、错误输出三个文件描述符
  • 输入重定向符号“<"

read var < /path/to/file

  • 输出重定向符号 “>" ">>" "2>" "&>"

echo 123 > /path/to/file

  • 输入和输出重定向组合使用

cat > /path/to/file <<EOF
I am $USER
EOF

变量的赋值

  • 变量名=变量值
  • 使用let为变量赋值
  • 将命令赋值给变量
  • 将明亮结果赋值给变量,使用 $()或者``
$ cmd1=`ls /var`
$ cmd2=$(ls /var)
  • 变量值有空格等特殊字符可以包含在" " 或''中
$ string1="hello bash"
$ echo $string1

$ string2='hello "bash"'
$ echo $string2

变量的引用

  • ${变量名}作为对变量的引用
  • echo ${变量名} 查看变量的值
  • ${变量名}在部分情况下可省略为 $变量名

变量的默认作用范围

定义好的变量只针对当前的终端或者当前的shell生效,如果在当前的shell产生子shell或者当前shell的平行shell或者是shell的父进程都是不生效的。

# 定义一个变量
$ a=1
# 进入子shell
$ bash
# 查看之前定义的变量
$ echo $a

# 子进程定义一个变量
$ a=2
$ exit
# 查看子进程定义的变量
$ echo $a
1
  • 变量的导出
    • export
  • 变量的删除
    • unset

系统环境变量

环境变量:每个shell打开就可以获得的变量

  • set和env命令
  • $? 上一条命令是否正确执行,非0是错误的
  • $$ 当前进程的pid
  • $0 当前的进程名称
  • $*$@代表所有位置参赛
  • $#代表位置参数的位置
  • $PATH
  • $PS1

位置变量

  • $1 $2 ... $n

环境变量的配置文件

  • /etc/profile
  • /etc/profile.d
  • ~/.bash_profile
  • ~/.bashrc
  • /etc/bashrc

数组

  • 定义数组
    • IPTS=(1.0.0.1 1.0.0.2 1.0.0.3)
  • 显示数组的所有元素
    • echo $(IPTS[@])
  • 显示数组元素的个数
    • echo $
  • 显示数组的第一个元素
    • echo $

转义与引用

  • 特殊字符:一个字符不仅有字面意义,还有元意(meta-meaning)
    • #注释
    • ;分号
    • \ 转义
    • "'引号
  • 常用的引用符号
    • " 双引号
    • ' 单引号
    • ` 反引号

运算符

  • 赋值运算符
    • = 赋值运算符,用于算数赋值和字符串赋值
    • 使用unset取消变量的赋值
    • = 除了作为赋值运算符还可以作为测试操作符
  • 算数运算符
    • 基本运算符
      • +加法 -减法 * 乘法 / 除法 ** 乘方 % 取余
    • 使用expr进行运算,expr只能支持整数,不支持浮点数, 符号和两个数字之间要有空格
      • expr 5 + 4
      • 对expr做运算后,把结果赋值,如下
      • num1=expr 4 + 5
  • 数字常量
    • 数字常量的使用方法
      • let "变量名=变量值"
      • 变量值使用0开头为八进制
      • 变量值使用0x开头为十六进制
  • 双圆括号是let命令的简化
    • (( a = 10 ))
    • (( a++ ))
    • echo $(( 10+20 ))

特殊符号

  • 引号
    • ' 完全引用,若引号内有变量,直接显示
    • " 不完全引用,对变量会解析变量
    • ` 执行命令
  • 括号
    • () (()) $()
      • 单独使用圆括号会产生一个子shell
      • 数组初始化ips=(ip1 ip2 ip3)
    • [] [[]]方括号
      • 单独使用方括号是测试(test)或数组元素功能
      • 两个方括号表示测试表达式
    • < >尖括号 重定向符号
    • {} 花括号
      • 输出范围
      • 文件复制 cp /etc/passwd
  • 运算和逻辑符号
    • + - ``* / % **` 算数运算符
    • > < = 比较运算符
    • && || ! 逻辑运算符
  • 转义符号
    • \ 转义某字符
    • \n 普通字符转义后有不同的功能
    • ``` 特殊字符转义后,当作普通字符使用
    • #注释
    • ;命令分隔符
      • case语句的分隔符号转义;;
    • :空指令
    • . 和source命令相同
    • ~家目录
    • ,分隔目录
  • 其他符号
    • * 通配符
    • ? 条件测试或通配符
    • $ 取值符号
    • | 管道符
    • & 后台运行
    • _ 空格

测试和判断

  • 退出和退出状态
    • exit
    • exit 10 返回10给shell,返回非0位不正常退出
    • $? 判断当前shell前一个进程是否正常退出
  • 测试命令test
    • test命令用于检查文件或者比较值
    • test可以做一下测试:
      • 文件测试
      • 整数比较测试
      • 字符串测试
    • test测试语句可以简化为[]符号
    • []符号还有扩展写法[[]]支持&&||<>
  • 使用if-then语句
    if [ 测试条件成立 ] 或 命令返回值是否为0
    then 执行相应命令
    fi 结束
    
  • 使用if-then-else语句
    if [ 测试条件成立 ]
    then 执行相应命令
    else 测试条件不成立,执行相应命令
    fi 结束
    
  • if-elif-else语句可以在条件不成立也允许相应的命令
    if [ 测试条件成立 ]
    then 执行相应命令
    elif [ 测试条件成立 ]
    then 执行相应命令
    else 测试条件不成立,执行相应命令
    fi 结束
    
  • 嵌套if的使用
    if [ 测试条件成立 ]
    then 执行相应命令
        if [ 测试条件成立 ]
        then 执行相应命令
        fi
    fi 结束
    

    分支

  • case语句和select语句可以构成分支
case "$变量" in
  "情况1" )
    命令...;;
  "情况2" )
    命令...;;
  * )
    命令... ;;
esac

循环

  • 使用for循环遍历命令的执行结果
    • for循环的语法
    for 参数 in 列表
    do 执行命令
    done 封闭一个循环
    
    • 使用反引号或$()方式执行命令,命令的结果当作列表处理
  • 使用for循环遍历变量和文件的内容
# 创建mp3的文件
touch a.mp3  b.mp3 c.mp3
# 把mp3修改成mp4结尾的
for filename in "ls *.mp3"
do
  mv $filename $(basename $filename .mp3).mp4
done
  • c语言风格的for命令
for ((变量初始化;循环判断条件;变量变化))
do
   循环执行命令
done
  • while循环
while test测试是否成立
do 
  命令
done
  • 死循环
while test测试一直成立
do 
  命令
done
  • until循环
    • until循环和while循环相反,循环测试为假时,执行循环,为真时循环停止
  • break和continue语句
  • 使用循环对命令参数的处理
#  对命令参数,如果是help 显示两次
while [ $# -ge 1 ]
do
  if [ "$1" = "help" ]; then
    echo $1 $1
  fi
  shift
done

函数

  • 自定义函数
    • 格式
    function fname() {
      命令
    }
    
    • 函数的执行
      • fname
  • 系统脚本
    • 系统自建了函数库,可在脚本中引用
      • /etc/init.d/functions
    • 自建函数库
      • 使用source 函数脚本文件 “导入” 函数

脚本优先级控制

  • 可以使用nice和renice调整脚本优先级
  • 避免出现不可控的死循环
    • 死循环导致cpu占用过高
    • 死循环导致死机

信号

  • 捕获信号
    • trap
  • kill -9上不可阻塞的

计划任务

  • 计划任务定义:
    • 让计算机在指定时间运行程序
  • 计划任务分类:
    • 一次性计划任务
      • at
      # at执行一次性计划任务
      $ at 20.42
      at> echo hello > /tmp/hello.txt
      # ctrl +d 退出
      at> <EOT>
      # atq查看执行任务
      $ atq
      
    • 周期性计划任务
      • cron
        • 配置方式
          • crontab -e
        • 查看现有的计划任务
          • crontab -l
        • 配置格式
          • 分钟 小时 日期 月份 星期 执行的命令
          • 注意命令的路径问题
    • 计划任务加锁
      • 如果计算机不能按照预期时间运行
      • anacontab延时计划任务
        • /etc/cron.d/0hourly
        • /etc/anacrontab
        • /etc/cron.daily/logrotate
      • flock锁文件
        # -x表示排他锁,运行只能运行一次 
        flock -xn "/tmp/f.lock" -c "/root.a.sh"
        
posted @ 2022-09-12 22:48  phper-liunian  阅读(270)  评论(0编辑  收藏  举报