다음과 같은 스크립트가 있습니다.
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
BATCHNUM
Null 사례 도 거부하려면 ${BATCHNUM:+a}
대신 를 사용하세요 ${BATCHNUM+a}
. ${VARIABLE+TEXT_IF_NULL}
매개변수 확장 구성에 대한 자세한 내용은 다음을 참조하세요 .배쉬 매뉴얼.
상위 프로세스를 종료하지 마십시오. 부모 프로세스가 무엇인지 모릅니다. 이 스크립트를 호출하는 스크립트를 중단해야 하는 경우(이 스크립트가 중단되는 경우) 이 스크립트의 종료 상태를 확인하도록 합니다. 예를 들어 스크립트 #2에서는 다음과 같습니다.
script3 || exit $?
또는 사용set -e
명령이 실패(0이 아닌) 상태를 반환하면 스크립트가 중단됩니다.