Shell编程语法

AAI脑图#5160812025-09-23 00:30
18600

内容详情

书写规范

文件头

  • Shebang
    • #!/bin/bash
      • 指定解释器

命名规则

  • 脚本名
    • 小写+下划线
      • 见名知意
  • 变量名
    • 全大写

执行方式

直接运行

  • bash script.sh

赋权运行

  • chmod +x script.sh && ./script.sh

子Shell

  • sh -x script.sh
    • 开启调试模式

变量

概念

  • 键值对存储
    • 内存临时数据

生命周期

  • 临时变量
    • 当前Shell会话
  • 永久变量
    • 写入

定义方式

  • 字符串
    • NAME="value"
  • 数字
    • COUNT=10
  • 命令结果
    • 反引号
    • $()
      • 推荐,可嵌套
  • 文件路径
    • LOG=/var/log/app.log

引号区别

  • 单引号
    • 原样输出
  • 双引号
    • 解析变量与转义

位置变量

$0

  • 脚本名称

$n

  • 第n个参数

$#

  • 参数个数

  • 所有参数
    • 整体字符串
    • 独立字符串

$?

  • 上条命令退出码
    • 0成功

$$

  • 当前脚本PID

$!

  • 最后一个后台进程PID

$_

  • 上一个命令的最后一个参数

传参方式

直接传参

  • sh test.sh a b c

赋值传参

  • PARAM=$1

交互式

  • read -p "Input:" VAR

变量子串

截取

  • ${VAR:start:length}

长度

  • ${#VAR}

删除

  • 从前删
    • ${VAR#pattern}
  • 从后删
    • ${VAR%pattern}

数值运算

整数

  • expr
    • expr $a + $b
  • $(())
    • echo $((a+b))
  • $[]
    • echo $[a*b]
  • let
    • let sum=a+b

小数

  • bc
    • echo "scale=2;10/3"|bc
  • awk
    • awk 'BEGIN{print 10/3}'

自定义返回

  • return N
    • 函数退出码

条件表达式

文件判断

  • 存在
  • 普通文件
  • 目录

字符串

  • 相等
  • 不等
  • 长度为0

数字比较

  • 等于
  • 大于
  • 小于

正则

  • [[ $str =~ ^[0-9]+$ ]]

流程控制

if

  • 单分支
    • if []; then ... fi
  • 多分支
    • if-elif-else

case

  • 多选匹配
    • case $var in pattern) ... ;; esac
      • 禁用Ctrl+C:

for

  • 列表循环
    • for i in {1..10}; do ... done

while

  • 条件循环
    • while read line; do ... done < file

循环控制

  • break
    • 跳出当前循环
  • continue
    • 跳过本次迭代
  • exit
    • 终止脚本

函数

定义

  • function fname() { ... }

传参

  • 位置参数
    • $1,$2...

变量作用域

  • 关键字
    • 限制函数内

返回值

  • return
    • 0-255整数
  • echo
    • 返回字符串

expect

自动交互

  • ,

案例

  • 批量SSH免密
    • 循环

数组

普通数组

  • 索引数字
    • ARR=(a b c)

关联数组

  • 字符串键
    • declare -A ARR