我一直试图弄清楚bash环境变量中括号的用途是什么。例如,在下面的代码示例中,为什么有些定义使用了{} aroudn PATH,例如export ... = ... / $ {PATH}。还要注意一些定义是不同的:有些定义使用{$ ECLIPSE_DIR}和括号内的$;有些人使用$ {PATH}和括号外的$,有些省略括号。这段代码通常有效,虽然有时会显示底部显示的错误(它们似乎是短暂的),但我不确定为什么这些错误只会出现在有时而不是其他错误。
有关包含bash环境变量的方法的常见做法是什么,何时应该使用括号,以及将$放在括号内部和外部之间有什么区别?另外,为什么有些行在变量名之前有“导出”,有些则没有?这有什么区别?
# 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
答案 0 :(得分:6)
括号通常用于清晰,但实际用途是从变量名中分解文本。说我有以下内容:
$ 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
问题时,导出用于使调用此脚本的shell可以访问变量。脚本完成后,脚本中设置的任何变量都不存在,除非导出。因此,如果您希望在运行该脚本后更改PATH
,则必须在脚本结束之前调用export PATH
。
答案 1 :(得分:2)
大括号与bash变量一起使用以消除变量之间的歧义。例如,考虑一下:
VAR=this
echo $VAR_and_that
echo ${VAR}_and_that
第一个echo没有打印任何东西,因为bash认为你试图回应我们的var this_and_that当然不存在。第二个回声没有这个问题并输出“this_and_that”,因为bash知道由于括号而扩展VAR变量。