我正在尝试编写一个使用nocasematch的bash函数,而不更改该选项的调用者设置。函数定义为:

is_hello_world() {
  shopt -s nocasematch
  [[ "$1" =~ "hello world" ]]
}

在我称呼它之前:
$ shopt nocasematch
nocasematch     off

称它为:
$ is_hello_world 'hello world' && echo Yes
Yes
$ is_hello_world 'Hello World' && echo Yes
Yes

符合预期,但现在调用者的nocasematch已更改:
$ shopt nocasematch
nocasematch     on

是否有任何简单的方法可以使选项在函数中本地化?

我知道我可以检查shopt -q的返回值,但这仍然意味着该函数应该记住这一点并在退出前将其重置。

最佳答案

函数主体可以是任何复合命令,而不仅仅是组命令({})。使用子 shell :

is_hello_world() (
  shopt -s nocasematch
  [[ "$1" =~ "hello world" ]]
)

07-24 22:26