변수가 존재하는지와 같지 않은지를 유효하게 비교합니다.

변수가 존재하는지와 같지 않은지를 유효하게 비교합니다.

내 스크립트의 구문에 문제가 있습니다 sh. Asus 라우터용 스크립트를 작성했습니다. 스크립트가 완벽하게 작동합니다. 하지만 다음 줄이 있습니다.

if [[ "$OldIP" && "$StartIP" != "$OldIP" ]]; then echo OK; fi

와 가 다른 경우에만 true이고 실행되어야 합니다 echo OK. 라인은 작동하지만 더 효율적으로 작동하는 것을 보고 싶습니다. 이러한 변수에는 유효한 IP 주소가 포함되어 있습니다.$StartIP$OldIP

어떤 경우에는 $OldIP아무것도 할당되지 않습니다(초기화되지 않음). 그러나 $OldIP그것이 존재하지 않는다면 그것은 내 껍질에서 그것들이 동일하지 않다는 것을 의미합니다!

나는 그 줄이 다음을 수행하는 것을 원하지 않습니다: $OldIP존재하지 않는 경우 -> 다른지 테스트 -> 실행 echo OK.

$OldIP나는 그 줄이 a) 존재하지 않는 경우 -> 끝을 의미하기를 원합니다 . b) $OldIP존재하는 경우 -> 서로 다른지 테스트 -> 실행합니다 echo OK.

"$OLDIP" &&그래서 가능하다면 어떻게든 제거 하고 싶습니다 . 배우고 싶은 질문이 아닙니다. :)

일종의 (하지만 작동하지 않습니다) :

if [ [ "$OldIP" ] != "$StartIP" ]; then echo OK; fi

또는

if [ $OldIP != "$StartIP" ]; then echo OK; fi

이게 내가 원하는건데 어느 시점에서 불평이 나오나요?오래된 IP비어 있음(하지만 잘 작동함)

하지만

if [ "$OldIP" != "$StartIP" ]; then echo OK; fi

작동하지만 이것을 무시합니다.오래된 IP비었다

답변1

엄밀히 말하면 변수에 값이 할당된 적이 없거나 이미 값이 할당된 경우 변수는 존재하지 않습니다 unset. 값이 빈 문자열인 변수존재하다.

표준 매개변수 확장은 문자열이 있는 경우 해당 문자열을 대체합니다 ${variable+value}(설정되지 않거나 비어 있지 않음). 이는 다음과 같이 존재 여부를 테스트하는 데 사용할 수 있습니다.valuevariable

if [ "${OldIP+x}" = "x" ] && [ "$OldIP" != "$StartIP" ]; then
    # code
fi

OldIP존재하는지 테스트하려면 test를 bash사용하세요 -v.

 if [[ -v OldIP ]] && [[ "$OldIP" != "$StartIP" ]]; then
     # code
 fi

$OldIP문자열 비교는 이전에 설정된 경우에만 (빈 문자열로 설정된 경우에도) 사이에서 수행됩니다 . 테스트에서는 다음을 사용합니다.$StartIPOldIP-v이름변하기 쉬운.

답변2

나는 당신의 대본이 매우 효과적이라고 생각합니다. 당신은 확실히 이것에 많은 사이클을 소비하지 않을 것입니다.

로직을 작성하는 또 다른 방법:

{ test -n "$OldIP" || test "$StartIP" != "$OldIP"; } && echo OK

이는 "OldIP가 설정되어 있거나 OldIP와 StartIP가 다르면 echo OK를 의미합니다.

기억하세요. 이것은 [읽는 데 사용할 수 있는 또 다른 이름입니다.test(1)man 1 test

편집: Gilles가 지적했듯이 ( ... )필요하지 않은 곳에 서브셸을 만들지 않도록 주의하세요.

{ ... ; }새 셸을 실행하지 않고 명령을 그룹화하는 데 사용할 수 있습니다.

간략한 참조:http://www.gnu.org/software/bash/manual/html_node/Command-Grouping.html

답변3

이는 귀하의 요구 사항과 일치합니다.

[ "${OldIP:-"$StartIP"}" != "$StartIP" ] && echo "OK"

같은 것(더 복잡함):

${OldIP:+false} || { [[ $OldIP != $StartIP ]] && echo "OK"; }

답변4

다음을 사용하는 경우 기본 대체를 사용할 수 있습니다 bash.

[[ "${OldIP:=oldunset}" != "${StartIP?StartUnset" ]] && echo "OK"

변수가 설정되지 않았거나 null인 경우 구문은 ${var:-def}현재 값 $var또는 지정된 기본값(이 경우)으로 평가됩니다. def변수의 값(있는 경우)은 변경되지 않습니다.

구문은 오류 코드 1과 함께 종료되고 설정되지 않았거나 null 인 경우 ${var?message}메시지가 표시됩니다 .message$var

명시적으로 호환성 테스트가 필요한 경우 test다음을 수행할 수 있습니다.

[ ! -z "$OldIP" -a "$OldIP" != "$StartIP" ] && echo "OK"

관련 정보