
스크립트의 어느 시점에서 구성 파일 이후 여러 변수가 설정되었는지 확인하고 source
, 설정되지 않은 경우 사용자에게 누락된 변수에 대해 알려주는 실행을 중지하고 싶습니다. 나는 열심히 노력했다
for var in $one $two $three ; do
...
그러나 example이 $two
설정되지 않으면 for 루프가 실행되지 않습니다 $two
. 내가 시도한 다음 것은
for var in one two three ; do
if [ -n ${!var} ] ; then
echo "$var is set to ${!var}"
else
echo "$var is not set"
fi
done
그러나 2가 설정되지 않은 경우에도 "2가 설정되지 않음" 대신 "2로 설정됨"이 표시됩니다.
모든 필수 변수가 설정되었는지 어떻게 확인할 수 있나요?
업데이트/솔루션:"세트"와 "세트이지만 비어 있음" 사이에 차이가 있다는 것을 알고 있습니다. 지금 사용하고 있습니다(감사합니다https://stackoverflow.com/a/16753536/3456281그리고 이 질문에 대한 답변)은 다음과 같습니다.
if [ -n "${!var:-}" ] ; then
따라서 var
설정되었지만 비어 있으면 여전히 유효하지 않은 것으로 간주됩니다.
답변1
인용 오류입니다.
if [ -n "${!var}" ] ; then
미래 보장: 설정
set -x
코드를 실행하기 전에 문제가 표시됩니다. 코드에 추가하는 대신 다음을 사용하여 스크립트를 호출할 수 있습니다.
bash -vx ./my/script.sh
답변2
프로그램을 중지하려면:
N=
${one?var 1 is unset}
${two:?var 2 is unset or null}
${three:+${N:?var 3 is set and not null}}
그게 다야. 물음표 뒤의 각 메시지는 다음으로 인쇄됩니다.stderr
및 상위 쉘사망 한.알았어, 그럼 안돼각메시지 - 하나만 - 첫 번째 실패만 메시지를 인쇄하여 쉘이 종료됩니다. 나는 이러한 테스트를 다음과 같이 사용하는 것을 좋아합니다.
( for v in "$one" "$two" "$three" ; do
i=$((i+1)) ; : ${v:?var $i is unset or null...}
done ) || _handle_it
이것에 대해서는 할 말이 더 많아요여기.
답변3
필요한 유일한 것은 테스트에서 인용문입니다.
for var in one two three ; do
if [ -n "${!var}" ] ; then
echo "$var is set to ${!var}"
else
echo "$var is not set"
fi
done
나를 위해 작동합니다.
답변4
당신은 추가할 수 있습니다
set -u
설정되지 않은 변수를 사용하려고 할 때 스크립트가 종료되도록 스크립트 시작 부분에 추가합니다.
이와 같은 스크립트
#!/bin/sh
set -u
echo $foo
결과는 다음과 같습니다
script.sh: 3: script.sh: foo: 매개변수가 설정되지 않았습니다.
대신 사용 하면 bash
오류는 다음과 같습니다.
script.sh: 3행: foo: 바인딩되지 않은 변수