Shell特殊变量与数组

特殊变量——脚本的参数

脚本也能像命令一样接收参数,通过$1、$2……来拿:

 #!/bin/bash
 # 文件名: args.sh
 # 用法: ./args.sh nginx /etc/nginx/nginx.conf 80
 ​
 echo "脚本名: $0"           # ./args.sh
 echo "第1个参数: $1"        # nginx
 echo "第2个参数: $2"        # /etc/nginx/nginx.conf
 echo "第3个参数: $3"        # 80
 echo "参数个数: $#"         # 3
 echo "所有参数: $@"          # nginx /etc/nginx/nginx.conf 80
 echo "上条命令退出码: $?"    # 0=成功,非0=失败
 echo "当前脚本PID: $$"      # 当前进程ID

变量

含义

典型用法

$0

脚本名

打印帮助信息

$1~$9

第1~9个参数

接收用户输入

$#

参数个数

校验参数够不够

$@

所有参数(各自独立)

for arg in "$@"遍历

$?

上条命令退出码

判断命令成功没

$$

当前进程PID

写锁文件

2.4 数组——一组数据一个变量搞定

 #!/bin/bash
 ​
 # 定义数组(空格分隔,小括号包起来)
 servers=("web01" "web02" "db01" "cache01")
 ​
 # 访问元素(索引从0开始)
 echo "第一个: ${servers[0]}"       # web01
 echo "第三个: ${servers[2]}"       # db01
 ​
 # 所有元素
 echo "全部: ${servers[@]}"
 ​
 # 数组长度
 echo "共${#servers[@]}台机器"
 ​
 # 遍历数组(运维最常用)
 for s in "${servers[@]}"; do
     echo "正在部署 $s ..."
     # scp app.tar.gz $s:/tmp/
 done

问题总结

  1. 变量赋值等号两边绝不能有空格——name="张三"✅,name = "张三"❌

  2. 引用变量永远加双引号——"$var"✅,$var❌(变量里有空格就炸)

  3. 生产脚本第一行必须是#!/bin/bash,不是#!/bin/sh

  4. 脚本写完先bash -x跑一遍,看清每一步执行了什么

  5. rm -rf前面一定要先echo确认路径,别手滑删了根目录

  6. 用$()取命令结果,别用反引号——可嵌套、可读性好