我有一些代码看起来像这样:
################### - Let's call this section 1
if [ -n "$STUFF_JAVA" ]; then
__LAUNCHER="$STUFF_JAVA"
else
__LAUNCHER="java"
fi
################### - Let's call this section 2
if [ -n "$JAVA_HOME" ]; then
# # echo "DEBUG: Using JAVA_HOME"
_STUFF_JAVA_HOME="$JAVA_HOME"
_STUFF_JAVA="$_STUFF_JAVA_HOME"/bin/$__LAUNCHER
else
echo "testing"
fi
############## - Let's call this section 3
_STUFF_JAVA_HOME="$JAVA_HOME"
_STUFF_JAVA="$_STUFF_JAVA_HOME"/bin/$__LAUNCHER
##############
我不明白为什么第 2 部分在设置 _STUFF_JAVA_HOME 变量时出现问题,但第 3 部分却没有?我需要在某处使用大括号或圆括号吗?
我希望我的代码设置以下变量:
_STUFF_JAVA_HOME
_STUFF_JAVA
我不明白为什么它被设置在第 3 部分而不是第 2 部分。
由于某种原因,在第 2 部分中,它无法选取变量来确定长度......
我有什么遗漏的吗?
(我对 shell 脚本缺乏经验。我正在读一本书,并且已经完成了第一章。)
答案1
(base) jj@tb-jj:/$ ################### - Let's call this section 1
if [ -n "$STUFF_JAVA" ]; then
__LAUNCHER="$STUFF_JAVA"
else
__LAUNCHER="java"
fi
################### - Let's call this section 2
if [ -n "$JAVA_HOME" ]; then
# # echo "DEBUG: Using JAVA_HOME"
_STUFF_JAVA_HOME="$JAVA_HOME"
_STUFF_JAVA="$_STUFF_JAVA_HOME"/bin/$__LAUNCHER
else
echo "testing"
fi
(base) jj@tb-jj:/$ echo "$_STUFF_JAVA"
./Some/Path/bin/java
(base) jj@tb-jj:/$ echo "$_STUFF_JAVA_HOME"
./Some/Path
它似乎工作正常。您能否更具体地说明不良行为到底是什么?另外,你确实有一个JAVA_HOME
变量集,是吗?
另外,我发现您在第 1 节测试和变量赋值中省略了_
from 。_STUFF_JAVA
这是故意的吗?
最后,-n
比较是验证变量不为空(或者更准确地说,它是长度不-n
为零的字符串)。
这与比较-z
(测试为了一个-z
ero 长度的字符串)。
因此,请注意[ -n "$my_var" ]
会产生与 不同的结果[ -n $my_var ]
。
(base) jj@tb-jj:/$ [ -n "$BOB" ] && echo 1 # I will produce nothing, because you're expanding $BOB inside a blank \
# string, and then testing if a string is null (it's not).
(base) jj@tb-jj:/$ [ -n $BOB ] && echo 1 # I will return 1, because you're now testing on an undeclared variable.
1
./Some/Path
(注意:在执行代码的前两部分之前,我手动设置了自己的 JAVA_HOME )