![如果未定义变量,请避免运行脚本](https://linux22.com/image/72609/%E5%A6%82%E6%9E%9C%E6%9C%AA%E5%AE%9A%E4%B9%89%E5%8F%98%E9%87%8F%EF%BC%8C%E8%AF%B7%E9%81%BF%E5%85%8D%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC.png)
我有一个如下所示的脚本:
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
如果任何命令返回失败(非零)状态,则中止脚本。