Linux Shell 脚本编程是自动化运维和系统管理的重要技能。
变量定义和使用:
- 变量定义:name="value"(注意等号两边不能有空格)
- 变量引用:$name 或 ${name}
- 只读变量:readonly name
- 删除变量:unset name
- 环境变量:export name="value"
- 特殊变量:$0(脚本名)、$1-$9(位置参数)、$#(参数个数)、$*(所有参数)、$@(所有参数)、$?(上一条命令退出状态)、$$(当前进程 PID)、$!(后台进程 PID)
条件判断:
- if 语句:if [ condition ]; then commands; fi
- 文件测试:-f(文件存在)、-d(目录存在)、-e(存在)、-r(可读)、-w(可写)、-x(可执行)
- 字符串比较:=(等于)、!=(不等于)、-z(空字符串)、-n(非空字符串)
- 数值比较:-eq(等于)、-ne(不等于)、-gt(大于)、-lt(小于)、-ge(大于等于)、-le(小于等于)
- 逻辑运算:-a(与)、-o(或)、!(非)
循环结构:
- for 循环:for i in {1..10}; do commands; done 或 for ((i=0; i<10; i++)); do commands; done
- while 循环:while [ condition ]; do commands; done
- until 循环:until [ condition ]; do commands; done
函数定义:
- 函数定义:function_name() { commands; } 或 function function_name { commands; }
- 函数调用:function_name arg1 arg2
- 返回值:return value(0-255)
- 局部变量:local var="value"
常用命令:
- echo:输出文本,echo -n 不换行,echo -e 解析转义字符
- printf:格式化输出
- read:读取用户输入,read -p "prompt" var
- test:条件测试,[ ] 是 test 的同义词
- expr:表达式求值
- let:算术运算
- awk:文本处理工具
- sed:流编辑器
- grep:文本搜索
数组操作:
- 定义数组:arr=(item1 item2 item3)
- 访问元素:${arr[0]}、${arr[@]}(所有元素)、${#arr[@]}(元素个数)
- 添加元素:arr+=("new_item")
最佳实践:
- 使用 set -e 遇到错误立即退出
- 使用 set -u 使用未定义变量时报错
- 使用 set -o pipefail 管道中任何命令失败都返回失败
- 添加注释说明脚本用途
- 使用引号保护变量