在POSIX sh中,您可以使用set:设置选项
#!/bin/sh
set -u;
echo "$notset";
给出预期:
参数未设置或为空
但是如何检查是否设置了选项-e
?
我想在我的脚本的某个时刻关闭它,但只有在它之前打开的情况下才能将其设置为打开
shell选项在$-
中以单个字符的字符串形式保存。使用测试-e
case $- in
(*e*) printf 'set -e is in effectn';;
(*) printf 'set -e is not in effectn';;
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 ]; then set -e; else set +e; fi
...
此功能称为参数展开
以下四个Remove-Pattern运算符中的任何一个都可以用于参数展开${parameter%[word]}
${parameter%%[word]}
${parameter#[word]}
${parameter##[word]}
阅读更多官方文件。
此外,任何寻找Bash特定的人,都可以使用以下-if [[ -o errexit ]]; then PARENT_ERREXIT=true; else PARENT_ERREXIT=false; fi
此功能称为Bash条件表达式
阅读Bash手册中的更多内容。