POSIX sh检查(测试)内置设置选项的值



在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手册中的更多内容。

相关内容

  • 没有找到相关文章

最新更新