바인딩되지 않은 변수를 중복 없이 처리하는 방법은 무엇입니까?

바인딩되지 않은 변수를 중복 없이 처리하는 방법은 무엇입니까?

명령 종료 상태를 처리하려면 다음과 같은 일반적인 패턴을 고려하십시오.

if COMMAND; then
    echo success
else
    echo failure
fi

동일한 변수 할당(주어진 set -o nounset)을 사용하면 작동하지 않습니다.

$ if foo="$no_such_variable"; then echo success; else echo failure; fi
bash: no_such_variable: unbound variable

변수 대체 확인또한 작동하지 않습니다.

$ if foo="${no_such_variable:?}"; then echo success; else echo failure; fi
bash: no_such_variable: parameter null or not set

명령문 내에서 할당의 반환 코드를 캡처하는 방법이 있습니까 if? if [[ $# -eq N ]]각 할당 자체에서 문제를 포착하는 대신 해당 문을 스크립트의 나머지 부분에 있는 모든 매개 변수 할당과 결합하므로 표준 해결 방법을 피하려고 합니다 .

이는 Python 모드와 유사합니다 if (foo := bar()):.

답변1

변수를 설정하지 않는 내장 테스트를 중심으로 무언가를 구축해 볼 수도 있습니다 test -v no_such_variable. 예를 들어 함수는 setvar이 테스트를 수행하고 정상일 때만 할당할 수 있습니다.

set -o nounset
setvar(){
  declare -n var=$1 # -n is like ${!var} but for lvalue too
  declare value=$2
  [ -v ${value} ] && var="${!value}"
}
if setvar foo no_such_variable
then echo success
else echo failure
fi

답변2

if 문에서 할당의 반환 코드를 캡처하는 방법이 있나요?

여기서 유용한 종료 상태를 볼 수 있을지 모르겠습니다.

set -u/ 아래의 변수 확장 nounset기능 은 ${var?message}다음과 같습니다 .쉘 종료변수가 설정되지 않은 경우. 이후에는 스크립트가 더 이상 실행되지 않기 때문에 스크립트에서 종료 값을 볼 수 없습니다.

작업에 명령 대체가 포함되어 있으면 종료 상태가 거기에서 나옵니다. 그렇지 않으면 할당이 성공합니다.

변수가 설정되지 않았는지 확인하려면 대체 값 확장을 사용해야 하며, ${var+string}변수가 설정되면(해당 값을 사용하지 않고) 값이 지정된 문자열로 확장되고, 설정되지 않으면 아무것도 확장되지 않습니다.

그래서

if [ "${var+set}" ]; then
    foo="$var"
    echo '$var copied to $foo'
else
    echo '$var is unset'
fi

아니면 nounset복사가 실패하지 않도록 비활성화하세요.

set +u
foo="$var"
echo '$var copied to $foo'

그러나 null이 아닌 값이 존재하는지 확인해야 하는 경우에는 이 작업을 별도로 수행해야 합니다.

관련 정보