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-zsh
的powerlevel 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}
用于提取字符串string
从position
开始的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脚本编程中能够更加灵活地处理变量和字符串操作。