Shell脚本进阶:${}提取变量的值

自己博客网站里的文章
Bash

Shell脚本进阶:使用${}提取变量

在Shell脚本编程中,提取变量通常使用$符号,即使用$VARIABLE来提取变量VARIABLE的值。而${}是另外一种用于引用变量的语法。

相比于$${]的功能更加强大,提供了一系列额外的功能,包括获取变量的值、进行字符串替换、执行命令以及提供默认值等。本文将详细介绍${}的用法和示例。

1. 获取变量的值

${var}用于获取变量var的值。这适用于普通变量、数组变量和环境变量。以下是一个示例:

name="John"
echo "欢迎,${name}!"

在上述示例中,${name}将会被替换为变量name的值,输出为"欢迎,John!"。

2. 大小写转换

在变量后使用^,可以修改字符串的大小写。

  • ${var^}会让字符串首字母大写
  • ${var^^}会让字符串全部大写
  • ${var,}会让字符串首字母小写
  • ${var,,}会让字符串全部小写
var="hello world"

echo "Original string: $var"                  # hello world
echo "Capitalizing the first letter: ${var^}" # Hello world
echo "Converting to uppercase: ${var^^}"      # HELLO WORLD

var="HELLO WORLD"
echo "Lowercasing the first letter: ${var,}" # hELLO WORLD
echo "Converting to lowercase: ${var,,}"     # hello world

3. 未定义时使用默认值

${var:-default}用于获取变量var的值,如果var未定义或为空,则使用默认值default。以下是一个示例:

echo "${debug_level:-"error"}" # error

debug_level="info"
echo "${debug_level:-"error"}" # info

这个语法在oh-my-zshpowerlevel 10k这个主题的下载命令中也有所使用:

git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k

这里就是如果用户在安装oh-my-zsh的时候指定了另外的安装目录,那么.zshrc文件中就会利用ZSH_CUSTOM变量来记录这个安装位置。

4. 未定义时设置默认值

${var:=default}用于获取变量var的值,如果var未定义或为空,则将其设置为默认值default并使用该值。以下是一个示例:

echo "${debug_level:="error"}" # error
echo "${debug_level}" # error

count=5
echo "当前计数:${count:=0}"      # 5
echo "变量已存在则不会重新设置:${count}" # 5

在上述示例中,变量debug_level未定义或为空,${debug_level:=0}将将其设置为默认值error。而count的值已经定义,所以${count:=5}直接输出当前计数为0,不会修改其默认值

5. 已定义时使用默认值

${var:+default}用于获取变量var的值,如果var已经定义,则使用默认值default

echo "${debug_flag:+"You will not see this debug info"}" # (空)

debug_flag="yes"
echo "${debug_flag:+"You will see this debug info"}" # You will see this debug info

6. 字符串替换

${var/pattern/replacement}用于将变量var中第一个匹配pattern的子串替换为replacement

  • ${var//pattern/replacement}会替换字符串中所有匹配的子字符串
  • ${var/%pattern/replacement}只会替换字符串中最后一个匹配的子字符串
  • ${var/#pattern/replacement}只会替换字符串中第一个匹配的子字符串
  • ${var/pattern/}相当于删除子字符串,即用空白来替换

以下是一个示例:

sentence="I love apples, apples are delicious."
echo "替换前的句子:${sentence}"
echo "替换后的句子:${sentence//apples/oranges}"

在上述示例中,${sentence//apples/oranges}将会将句子中的所有"apples"替换为"oranges"。

7. 提取子字符串

${string:position:length}用于提取字符串stringposition开始的length个字符,即获得子字符串。也支持负数开始的positon,表示从字符串结尾开始。

以下是一个示例:

name="JackWang"
echo "First Name: ${name:0:4}"
echo "Last Name: ${nane:(-4):4}"

注意,负数需要用括号括起来。

8. 变量长度

${#var}用于获取变量var的长度(字符个数)。以下是一个示例:

word="Hello"
echo "单词长度为:${#word}"

在上述示例中,${#word}将会输出变量word的长度,即单词"Hello"的长度为5。

9. 总结

${}结构在Shell脚本编程中提供了灵活和强大的功能。通过它,我们可以方便地引用变量、进行字符串替换、提供默认值等操作,以满足不同的编程需求。

希望本文对你理解${}的用法有所帮助,让你在Shell脚本编程中能够更加灵活地处理变量和字符串操作。