如果未定义变量,请避免运行脚本

如果未定义变量,请避免运行脚本

我有一个如下所示的脚本:

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运行脚本的 shell 中设置选项,如果您尝试扩展未设置的变量,该选项将中止;第二个$BATCHNUM在无操作的上下文中扩展,以在执行其他操作之前触发中止。

如果您想要更有用的错误消息,您可以改为编写:

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

或者类似的。

答案2

这里您要检查BATCHNUM是否设置并且不为空。

POSIX shell 提供了参数扩展为了这份工作。只需在使用之前添加此行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空的情况,请使用${BATCHNUM:+a}代替${BATCHNUM+a}。有关${VARIABLE+TEXT_IF_NULL}参数扩展构造的信息,请参见bash手册

不要杀死父进程。你不知道父进程是什么。如果某个调用此脚本的脚本需要中止(如果此脚本中止),请使其检查此脚本的退出状态。例如在脚本 #2 中:

script3 || exit $?

或使用set -e如果任何命令返回失败(非零)状态,则中止脚本。

相关内容