내 스크립트의 구문에 문제가 있습니다 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}
(설정되지 않거나 비어 있지 않음). 이는 다음과 같이 존재 여부를 테스트하는 데 사용할 수 있습니다.value
variable
if [ "${OldIP+x}" = "x" ] && [ "$OldIP" != "$StartIP" ]; then
# code
fi
OldIP
존재하는지 테스트하려면 test를 bash
사용하세요 -v
.
if [[ -v OldIP ]] && [[ "$OldIP" != "$StartIP" ]]; then
# code
fi
$OldIP
문자열 비교는 이전에 설정된 경우에만 (빈 문자열로 설정된 경우에도) 사이에서 수행됩니다 . 테스트에서는 다음을 사용합니다.$StartIP
OldIP
-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"