在 POSIX sh 中你可以使用 set 设置选项:
#!/bin/sh
set -u;
echo "$notset";
这给出了预期:
参数未设置或为空
但是如何检查选项
-e
是否已设置?
我希望在脚本的某个时刻将其关闭,但仅当它之前处于打开状态时才将其设置回打开状态。
shell 选项作为单个字符的字符串保存在
$-
中。您使用 测试
-e
case $- in
(*e*) printf 'set -e is in effect\n';;
(*) printf 'set -e is not in effect\n';;
esac
按照接受的答案,我这样做了:
存储选项状态(空字符串=关闭,选项字符=打开)
option="e"
option_set="$(echo $- | grep "$option")"
将其恢复到存储在
option_set
中的先前值,以防我修改其状态:
if [ -n "$option_set" ]; then
set -"$option"
else
set +"$option"
fi
如果您想使用该解决方案,这里有一个测试脚本:
#!/bin/sh
return_non_zero() {
echo "returing non zero"
return 1
}
set -e # turn on option
# set +e # turn off option
echo "1. options that are set: $-"
option="e"
option_set="$(echo $- | grep "$option")"
echo "turn off "$option" option" && set +"$option"
# echo "turn on "$option" option" && set -"$option"
echo "2. options that are set: $-"
# should terminate script if option e is set
return_non_zero
# restore option to prev value
if [ -n "$option_set" ]; then
set -"$option"
else
set +"$option"
fi
echo "3. options that are set: $-"
echo "END"
#!/bin/sh
# Before sourcing any other script (if required), add the following line
if [ -z ${-%*e*} ]; then PARENT_ERREXIT=true; else PARENT_ERREXIT=false; fi
. source-any-other-script-if-required.sh
...
# Turn the errexit off whenever you wish
set +e
...
# Set back the option the way it was when entering your script
if [ $PARENT_ERREXIT = "true" ]; then set -e; else set +e; fi
...
此功能称为参数扩展。
以下四个删除模式运算符中的任何一个都可用于参数扩展。
${parameter%[word]}
${parameter%%[word]}
${parameter#[word]}
${parameter##[word]}
从官方文档了解更多信息。
此外,任何寻找特定于 Bash 的人,您都可以使用以下 -
if [[ -o errexit ]]; then PARENT_ERREXIT=true; else PARENT_ERREXIT=false; fi
此功能称为 Bash 条件表达式。
从 Bash 手册阅读更多内容。