Bash 参数扩展 讲解

256 阅读1分钟

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 脚本中灵活地操作字符串,简化代码,提高可读性和可维护性。