在bash中导出环境变量时何时使用括号?

10

我一直在试图弄清楚bash环境变量中括号的作用。例如,在下面的实际代码示例中,为什么有些定义在PATH周围使用了{},例如export ...=.../${PATH}。也请注意,有些定义是不同的:有些使用带有括号内的${$ECLIPSE_DIR};有些使用带有括号外$${PATH},而有些则完全省略了括号。这段代码通常可以工作,尽管有时会显示像底部所示的错误(它们似乎是瞬态的),我不确定为什么这样的错误只有有时才会出现。

关于如何包含bash环境变量的通用做法是什么?在何时应该使用括号,将$放在括号内和括号外有什么区别?此外,为什么有些行在变量名之前有一个"export",而有些则没有?这里有什么区别?

# ECLIPSE
ECLIPSE_DIR=$HOME/eclipse
PATH=${PATH}:{$ECLIPSE_DIR}

# ANT
ANT_HOME=/usr/bin/ant
PATH=${ANT_HOME}/bin:${PATH}
export ANT_HOME PATH

# GRADLE
export GRADLE_HOME=/usr/local/gradle
export PATH=$GRADLE_HOME/bin:$PATH</code>


-bash: export: `/usr/bin/ant/bin:/usr/local/bin:{/Users/me/eclipse}:/usr/bin/scala-2.9.0.1/bin:/usr/local/mysql/bin:/usr/local/bin:{/Users/me/eclipse}': not a valid identifier
2个回答

7

大括号通常用于增加代码的可读性,但是还有一个实际的用途就是将文本与变量名分开。假设我有以下代码:

$ word="ello"
$ echo "h$word"
hello
$ echo "y$wordw" # bash tries to find the var wordw, and replaces with a blank
y
$ echo "y${word}w"
yellow

变量名通常会被大部分标点符号(特别是 . 或 /)自动分隔。

echo "$word/$word.$word"
ello/ello.ello

看到你提供的错误提示,{$ECLIPSE_DIR}被展开并被文字大括号包围。我认为解决方法应该是将其改为${ECLIPSE_DIR} 对于export问题的回答,export用于使变量对调用此脚本的shell可访问。在脚本中设置的任何变量在脚本结束后都不存在,除非它被导出。因此,如果您希望在运行该脚本后更改PATH,必须在脚本结束前调用export PATH

2

花括号与Bash变量一起使用,以消除变量之间的歧义。例如,考虑以下情况:

VAR=this
echo $VAR_and_that
echo ${VAR}_and_that

第一个echo没有输出任何内容,因为bash认为您正在尝试输出不存在的变量this_and_that。第二个echo没有这个问题,并输出了this_and_that,因为bash知道要扩展大括号中的VAR变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接