변수가 정의되지 않은 경우 스크립트를 실행하지 마십시오


18

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

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 스크립트)도 강제로 중지 할 수 있다면 더 좋습니다.

답변:


28

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

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

또는 비슷합니다.


18

여기서 확인하려는 BATCHNUMnull이 아닌 설정되어 있습니다.

POSIX 쉘은 이 작업에 대한 매개 변수 확장 을 제공합니다 . 다음을 사용하기 전에이 줄을 추가하십시오 BATCHNUM.

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

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

: "${BATCHNUM:=3}"

4
[ -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그저 나뿐입니다).


2

if [ -z "$BATCHNUM" ]; then
    exit 2;
fi

비어 있는지 확인하십시오 $BATCHNUM. $PPID부모 와 함께 해를 끼칠 수 있습니다 ( kill $PPID). 조부모를 살해하려면의 데이터를 보는 것과 같은 다른 방법으로 프로세스 ID를 가져와야합니다 /proc/$PPID.

그러나 부모가 사망하면 신호 ( SIGHUP)를 보내 므로 누군가를 죽이기 전에 덫을 놓아야합니다.

trap '' SIGHUP

업데이트 : 부모를 죽여야한다고 생각하면 잘못하고 있습니다. 의미있는 종료 코드를 반환하십시오. 부모 스크립트는 호출 된 스크립트의 리턴 코드를 확인하고 이에 따라 반응해야합니다.


1
a는 잔인한 ... :) 비트
user40780

1

BATCHNUM가 정의되어 있는지 테스트하고 정의되어 있지 않으면 종료하십시오.

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

BATCHNUM비어 있는 경우도 거부 하려면${BATCHNUM:+a} 대신을${BATCHNUM+a} . ${VARIABLE+TEXT_IF_NULL}매개 변수 확장 구문 에 대한 정보 는 bash 매뉴얼을 참조하십시오 .

부모 프로세스를 죽이지 마십시오. 부모 프로세스가 무엇인지 모릅니다. 이 스크립트를 호출하는 일부 스크립트가이 스크립트가 중단되면 중단해야하는 경우이 스크립트의 종료 상태를 확인하십시오. 예를 들어 스크립트 # 2 :

script3 || exit $?

set -e명령이 실패 (0이 아님) 상태를 반환하는 경우 스크립트를 중단하는 데 사용 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.