Bash 参数扩展(Parameter Expansion)是一组强大的字符串操作工具,允许你对变量的值进行各种处理。以下是一些常见的参数扩展方法及其示例:
基本语法
${variable}
1. 默认值和替换
-
使用默认值:
${variable:-default}如果
variable未设置或为空,使用default。name=${USER:-guest} echo $name -
设置默认值:
${variable:=default}如果
variable未设置或为空,将default赋值给variable。name=${USER:=guest} echo $name -
替换为空值:
${variable:+replacement}如果
variable已设置且不为空,使用replacement。greeting=${USER:+Hello, $USER} echo $greeting -
仅在变量未设置时报错:
${variable:?error_message}如果
variable未设置或为空,显示error_message并退出脚本。: ${USER:?USER is not set}
2. 字符串操作
-
删除最短匹配前缀模式:
${variable#pattern}从左边开始删除匹配
pattern的最短部分。path="/usr/local/bin/script.sh" echo ${path#*/} # 输出 "usr/local/bin/script.sh" -
删除最长匹配前缀模式:
${variable##pattern}从左边开始删除匹配
pattern的最长部分。echo ${path##*/} # 输出 "script.sh" -
删除最短匹配后缀模式:
${variable%pattern}从右边开始删除匹配
pattern的最短部分。filename="document.txt" echo ${filename%.txt} # 输出 "document" -
删除最长匹配后缀模式:
${variable%%pattern}从右边开始删除匹配
pattern的最长部分。path="/usr/local/bin/script.sh" echo ${path%%/*} # 输出 ""
3. 字符串长度
-
获取字符串长度:
${#variable}str="Hello, World!" echo ${#str} # 输出 "13"
4. 子字符串提取
-
提取子字符串:
${variable:offset:length}str="Hello, World!" echo ${str:7:5} # 输出 "World" -
从偏移量提取到结尾:
${variable:offset}echo ${str:7} # 输出 "World!"
5. 字符串替换
-
替换第一个匹配:
${variable/pattern/replacement}text="Hello, World!" echo ${text/World/Universe} # 输出 "Hello, Universe!" -
替换所有匹配:
${variable//pattern/replacement}text="Hello, World! Hello, everyone!" echo ${text//Hello/Hi} # 输出 "Hi, World! Hi, everyone!" -
替换开头的匹配:
${variable/#pattern/replacement}text="Hello, World!" echo ${text/#Hello/Hi} # 输出 "Hi, World!" -
替换结尾的匹配:
${variable/%pattern/replacement}text="Hello, World!" echo ${text/%World!/Universe!} # 输出 "Hello, Universe!"
示例
假设有一个变量 DOMAIN:
DOMAIN="example.com"
使用参数扩展进行不同操作:
# 删除最后一个点及其后的部分
PRE_DOMAIN=${DOMAIN%.*}
echo $PRE_DOMAIN # 输出 "example"
# 获取字符串长度
length=${#DOMAIN}
echo $length # 输出 "11"
# 提取子字符串
sub_domain=${DOMAIN:0:7}
echo $sub_domain # 输出 "example"
# 替换子字符串
new_domain=${DOMAIN/com/org}
echo $new_domain # 输出 "example.org"
通过这些参数扩展,你可以在 Bash 脚本中灵活地操作字符串,简化代码,提高可读性和可维护性。