쉘 스크립트가 if 문에서 변수를 가져오지 못함

쉘 스크립트가 if 문에서 변수를 가져오지 못함

다음과 같은 코드가 있습니다.

  ################### - 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을 수동으로 설정했습니다.)

관련 정보