다음과 같은 코드가 있습니다.
################### - 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
왜 2부에는 없고 3부에는 설정되어 있는지 이해가 안 됩니다.
어떤 이유에서인지 2부에서는 길이를 결정하는 변수를 선택할 수 없습니다.
내가 놓친 것이 있나요?
(저는 쉘 스크립팅에 대한 경험이 없습니다. 책을 읽고 있는데 첫 번째 장을 마쳤습니다.)
답변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에서 테스트 및 변수 할당을 생략한 것으로 나타났습니다 _
. _STUFF_JAVA
의도적인 걸까요?
마지막으로 비교를 통해 변수가 비어 있지 않은지(더 정확하게는 길이가 0이 아닌 문자열 -n
인지) 확인됩니다 .-n
이것은 -z
(테스트~을 위한ero -z
길이 문자열).
따라서 [ -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을 수동으로 설정했습니다.)