# Bash 中的参数扩展
变量处理
1. ${varname:-word}
2. ${varname:=word}
3. ${varname:+word}
4. ${varname:offset:length}
5. 总结对比
语法 | 作用 | 是否修改变量 |
${varname:-word} | 如果 varname 未设置或为空,返回 word ;否则返回 varname 的值 | 否 |
${varname:=word} | 如果 varname 未设置或为空,将 word 赋值给 varname 并返回 word | 是 |
${varname:+word} | 如果 varname 已设置且不为空,返回 word ;否则返回空 | 否 |
${varname:offset:length} | 从 varname 的值中提取子字符串 | 否 |
6. 实际应用示例
示例 1:设置默认值
name=""
echo "Hello, ${name:-Guest}" # 输出 "Hello, Guest"
示例 2:赋值并设置默认值
unset name
echo "Hello, ${name:=Guest}" # 输出 "Hello, Guest",同时 name 被设置为 "Guest"
echo $name # 输出 "Guest"
示例 3:条件返回
name="Alice"
echo ${name:+"Welcome"} # 输出 "Welcome"
示例 4:提取子字符串
str="Hello, World"
echo ${str:7:5} # 输出 "World"
7. 注意事项
- 如果
varname
未设置,${varname:-word}
和 ${varname:=word}
会返回 word
,但 ${varname:+word}
会返回空。
${varname:=word}
会修改变量的值,因此需要谨慎使用。
- 子字符串提取时,
offset
从 0 开始计数,length
必须是非负整数。
字符串处理
1. ${variable#pattern}
2. ${variable##pattern}
3. ${variable%pattern}
4. ${variable%%pattern}
5. ${variable/pattern/string}
6. ${variable//pattern/string}
7. ${#varname}
8. 总结对比
语法 | 作用 | 示例 |
${variable#pattern} | 从开头删除最短匹配的部分 | ${path#/*/} → local/bin |
${variable##pattern} | 从开头删除最长匹配的部分 | ${path##/*/} → bin |
${variable%pattern} | 从末尾删除最短匹配的部分 | ${file%.*} → example.txt |
${variable%%pattern} | 从末尾删除最长匹配的部分 | ${file%%.*} → example |
${variable/pattern/string} | 替换第一个匹配的部分 | ${text/hello/hi} → hi world |
${variable//pattern/string} | 替换所有匹配的部分 | ${text//hello/hi} → hi hi world |
${#varname} | 返回变量值的长度 | ${#text} → 5 |
9. 实际应用示例
示例 1:删除文件扩展名
file="archive.tar.gz"
name=${file%.*} # 删除最短匹配的 ".gz"
echo $name # 输出 "archive.tar"
示例 2:提取文件名
path="/usr/local/bin/bash"
name=${path##*/} # 删除最长匹配的 "/usr/local/bin/"
echo $name # 输出 "bash"
示例 3:替换字符串
text="foo bar foo"
new_text=${text//foo/bar} # 替换所有 "foo" 为 "bar"
echo $new_text # 输出 "bar bar bar"
示例 4:计算字符串长度
text="Hello, World!"
length=${#text}
echo $length # 输出 "13"
10. 注意事项
#
和 %
分别表示从开头和末尾匹配。
- 单个符号(
#
或 %
)表示最短匹配,双符号(##
或 %%
)表示最长匹配。
${variable/pattern/string}
和 ${variable//pattern/string}
中的 pattern
支持通配符(如 *
和 ?
)。
${#varname}
返回的是字符数,而不是字节数(对于多字节字符需要注意)。
表达式
1. 逻辑操作符
statement1 && statement2
statement1 || statement2
2. 字符串比较
str1 = str2
str1 != str2
str1 < str2
str1 > str2
-n str1
-z str1
3. 文件测试
-a file
-d file
-e file
-f file
-r file
-s file
-w file
-x file
-N file
-O file
-G file
4. 文件时间比较
file1 -nt file2
file1 -ot file2
5. 数值比较
-lt
(less than)
-le
(less than or equal)
-eq
(equal)
-ge
(greater than or equal)
-gt
(greater than)
-ne
(not equal)
6. 总结
- 逻辑操作符
&&
和 ||
用于组合多个命令。
- 字符串比较用于判断字符串的内容和长度。
- 文件测试用于检查文件的状态和权限。
- 数值比较用于比较整数。
https://github.com/Idnan/bash-guide