변수가 정의되지 않은 경우 스크립트 실행 방지

변수가 정의되지 않은 경우 스크립트 실행 방지

다음과 같은 스크립트가 있습니다.

c=0
for f in */*; do
cp -v "$f" "/myhome/CE$(printf '%0*d' 2 $BATCHNUM)-new-stuctures_extracted/test-$(printf '%0*d' 5 $c)"
c=$((c=c+1))
done

그러나 사용자는 BATCHNUM을 호출하는 변수를 제공해야 합니다. 그렇지 않으면 스크립트 실행을 강제로 중지해야 합니다. 이 스크립트를 호출하는 스크립트(또는 이 스크립트를 호출하는 #2 스크립트를 호출하는 #1 스크립트)도 강제로 중지할 수 있다면 더 좋을 것입니다.

답변1

가장 빠른 방법은 아마도 스크립트 시작 부분에 다음 두 줄을 추가하는 것입니다.

set -u # or set -o nounset
: "$BATCHNUM"

첫 번째 줄은 nounset설정되지 않은 변수를 확장하려고 하면 중단되는 스크립트를 실행하는 셸에서 옵션을 설정합니다. 두 번째 줄은 $BATCHNUM다른 작업을 수행하기 전에 중단을 트리거하기 위해 no-op 컨텍스트에서 확장됩니다.

더 유용한 오류 메시지를 원한다면 다음과 같이 작성할 수 있습니다.

if [[ -z "$BATCHNUM" ]]; then
    echo "Must provide BATCHNUM in environment" 1>&2
    exit 1
fi

아니면 그런 것.

답변2

BATCHNUM여기에서 설정되어 있고 비어 있지 않은지 확인하고 싶습니다 .

POSIX 쉘은 다음을 제공합니다.매개변수 확장이 일을 위해. 사용하기 전에 다음 줄을 추가하세요 BATCHNUM.

: "${BATCHNUM:?Variable not set or empty}"

BATCHNUM또는 사용자가 기본값을 제공하지 않은 경우 기본값을 설정하는 것이 좋습니다.

: "${BATCHNUM:=3}"

답변3

[ -n "$BATCHNUM" ] || { kill "$PPID"; exit 1; }
#Unless $BATCHNUM is defined and unempty, ask parent process to exit and exit w/ 1

이는 bash와 POSIX sh 모두에서 작동합니다. 나는 빈 변수와 정의되지 않은 변수를 구별하는 것을 좋아하지 않습니다(예: 구분하지 않지만 set -u그게 바로 나입니다).

답변4

정의되었는지 테스트 BATCHNUM하고 그렇지 않으면 종료합니다.

if [ -n "${BATCHNUM-a}" ]; then
  echo >&2 "Fatal error: BATCHNUM not set"
  exit 2
fi

BATCHNUMNull 사례 도 거부하려면 ${BATCHNUM:+a}대신 를 사용하세요 ${BATCHNUM+a}. ${VARIABLE+TEXT_IF_NULL}매개변수 확장 구성에 대한 자세한 내용은 다음을 참조하세요 .배쉬 매뉴얼.

상위 프로세스를 종료하지 마십시오. 부모 프로세스가 무엇인지 모릅니다. 이 스크립트를 호출하는 스크립트를 중단해야 하는 경우(이 스크립트가 중단되는 경우) 이 스크립트의 종료 상태를 확인하도록 합니다. 예를 들어 스크립트 #2에서는 다음과 같습니다.

script3 || exit $?

또는 사용set -e명령이 실패(0이 아닌) 상태를 반환하면 스크립트가 중단됩니다.

관련 정보