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

问题描述 投票:0回答:3

在 POSIX sh 中你可以使用 set 设置选项:

#!/bin/sh

set -u;

echo "$notset";

这给出了预期:

参数未设置或为空

但是如何检查选项

-e
是否已设置?

我希望在脚本的某个时刻将其关闭,但仅当它之前处于打开状态时才将其设置回打开状态。

sh posix
3个回答
3
投票

shell 选项作为单个字符的字符串保存在

$-
中。您使用
 测试 
-e

case $- in
(*e*)    printf 'set -e is in effect\n';;
(*)      printf 'set -e is not in effect\n';;
esac

0
投票

按照接受的答案,我这样做了:

存储选项状态(空字符串=关闭,选项字符=打开)

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"

0
投票
#!/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 手册阅读更多内容。

© www.soinside.com 2019 - 2024. All rights reserved.