Bash
2026-03-30
新闻来源:网淘吧
围观:14
电脑广告
手机广告
快速参考
| 主题 | 文件 |
|---|---|
| 数组与循环 | arrays.md |
| 参数展开 | expansion.md |
| 错误处理模式 | errors.md |
| 测试与条件判断 | testing.md |
引号陷阱
- 始终给变量加引号——
"$var"而非$var,空格会破坏未加引号的变量 "${arr[@]}"保留数组元素——${arr[*]}会将元素合并为单个字符串- 单引号是字面量——
'$var'不会展开变量 - 命令替换要加引号——
"$(command)"不$(command)
单词拆分与通配符扩展
- 未引用的
$var会在空白字符处拆分——file="my file.txt"; cat $file会失败 - 未引用的
*会扩展为文件——如果是字面意思请加引号或转义:"*"或\* set -f可禁用通配符扩展——或者正确地为所有内容加上引号
测试括号
[[ ]]优于[ ]——无单词拆分,支持&&、||和正则表达式[[ $var == pattern* ]]—右侧使用不带引号的通配符模式[[ $var =~ regex ]]—正则表达式匹配,不要给正则表达式加引号-z为空,-n非空—[[ -z "$var" ]]测试是否为空
子shell陷阱
- 管道会创建子shell—
cat file | while read; do ((count++)); done—count值丢失 - 使用
while read < file或进程替换—while read; do ...; done < <(command) ( )是子shell,{ }是同一shell—在( )中的变量不会保留
退出处理
set -e出错时退出——但在if、||、&&条件中不生效set -u未定义变量时报错——可捕获拼写错误set -o pipefail——管道中任意命令失败则整体失败,而非仅最后一条trap cleanup EXIT——在任何退出时(包括错误)都会运行
数组
- 声明:
arr=(一 二 三)——或arr=()然后arr+=(项目) - 长度:
${#arr[@]}——而不是${#arr} - 所有元素:
"${arr[@]}"—务必使用引号 - 索引:
${!arr[@]}—对稀疏数组有用
参数扩展
- 默认值:
${var:-default}—若变量未设置或为空则使用默认值 - 分配默认值:
${var:=default}—同时赋值给变量 - 未设置时报错:
${var:?error message}—显示错误信息并退出 - 子字符串:
${var:0:5}—前5个字符 - 移除前缀:
${var#pattern}—##表示贪婪匹配
算术运算
$(( ))用于数学运算—result=$((a + b))(( ))用于条件判断—if (( count > 5 )); then- 不需要
$在内部使用$(( ))—$((count + 1))而不是$(($count + 1))
常见错误
[ $var = "value" ]如果 var 为空会失败—请使用[ "$var" = "value" ]或[[ ]]if [ -f $file ]文件名含空格时—务必加上引号:if [[ -f "$file" ]]local在函数中—不使用它,变量将是全局的read没有-r—反斜杠被解释为转义符回显可移植性—使用打印函数以获得可靠的格式化效果
文章底部电脑广告
手机广告位-内容正文底部


微信扫一扫,打赏作者吧~