繁体   English   中英

我们什么时候需要在 shell 变量周围加上花括号?

[英]When do we need curly braces around shell variables?

在 shell 脚本中,我们什么时候在扩展变量时使用{}

例如,我看到了以下内容:

var=10        # Declare variable

echo "${var}" # One use of the variable
echo "$var"   # Another use of the variable

有显着差异,还是只是风格? 一个比另一个更受欢迎吗?

在这个特定的例子中,它没有任何区别。 但是,如果您想扩展字符串中的变量foo<\/code> , ${}<\/code> {}<\/code>的 {} 很有用

"${foo}bar"

变量是在没有$<\/code>和没有{}<\/code>的情况下声明和分配的。 你必须使用

var=10

您使用{}进行分组。 大括号是取消引用数组元素所必需的。 例子:

dir=(*)           # store the contents of the directory into an array
echo "${dir[0]}"  # get the first entry.
echo "$dir[0]"    # incorrect

您还可以在大括号内进行一些文本操作:

STRING="./folder/subfolder/file.txt"
echo ${STRING} ${STRING%/*/*}

访问数组元素和执行大括号扩展总是需要花括号。

即使没有歧义,也不要过分谨慎并使用{}进行 shell 变量扩展。

例如:

dir=log
prog=foo
path=/var/${dir}/${prog}      # excessive use of {}, not needed since / can't be a part of a shell variable name
logfile=${path}/${prog}.log   # same as above, . can't be a part of a shell variable name
path_copy=${path}             # {} is totally unnecessary
archive=${logfile}_arch       # {} is needed since _ can be a part of shell variable name

所以,最好把这三行写成:

path=/var/$dir/$prog
logfile=$path/$prog.log
path_copy=$path

这绝对更具可读性。

由于变量名不能以数字开头,shell 不需要{}围绕编号变量(如$1$2等),除非这种扩展后跟数字。 这太微妙了,确实可以在这种情况下明确使用{}

set app      # set $1 to app
fruit=$1le   # sets fruit to apple, but confusing
fruit=${1}le # sets fruit to apple, makes the intention clear

看:

变量名的结尾通常用空格或换行符表示。 但是,如果我们在打印变量值后不想要空格或换行符怎么办? 花括号告诉 shell 解释器变量名的结尾在哪里。

经典示例 1) - 没有尾随空格的 shell 变量<\/h1>
示例 2) 带有版本化 jar 的 Java 类路径<\/h2>
# WRONG - no such variable LATESTVERSION_src CLASSPATH=hibernate-$LATESTVERSION_src.zip:hibernate_$LATEST_VERSION.jar # RIGHT CLASSPATH=hibernate-${LATESTVERSION}_src.zip:hibernate_$LATEST_VERSION.jar<\/code><\/pre>

(弗雷德的回答已经说明了这一点,但他的例子有点太抽象了)

"

根据 SierraX 和 Peter 关于文本操作的建议,大括号{}<\/code>用于将变量传递给命令,例如:

假设您有一个sposi.txt<\/em>文件,其中包含一部著名的意大利小说的第一行:

> sposi="somewhere/myfolder/sposi.txt"
> cat $sposi

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM