【问题标题】:Bash parameter expansion works only in interactive shell, but not in scriptBash 参数扩展仅适用于交互式 shell,但不适用于脚本
【发布时间】:2016-10-21 15:20:45
【问题描述】:

在用户控制台我有bash:

$ echo $SHELL
/bin/bash
$ bash --version
GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)

我在 test.sh 文件中有代码:

$ cat test.sh
aaa='---aa-aa---'
echo "${aaa}"
echo 'does not work...'
# trim "-"
echo ${aaa/+(-)}
echo ${aaa%%+(-)}
echo 'works for one symbol...'
echo ${aaa%-}
echo ${aaa/-}

最后两行工作正常,但前两行。

$ bash test.sh
---aa-aa---
does not work...
---aa-aa---
---aa-aa---
works for one symbol...
---aa-aa--
--aa-aa---

同时,如果你想让这个控制台工作:

$ aaa='---aa-aa---'
$ echo ${aaa/+(-)}
aa-aa---
$ echo ${aaa%%+(-)}
---aa-aa

那么,为什么它在脚本中不起作用?

【问题讨论】:

  • 试图决定是否将其作为stackoverflow.com/questions/26726264/… 的副本关闭,或者以相反的方式进行。 @tripleee,你有意见吗?
  • ...实际上,在审查时,我认为这个问题的实例比另一个问题更清楚地提出,足以否定对方的时间优势(首先被问到)..

标签: bash trim


【解决方案1】:

您似乎在交互式 shell 中启用了shopt -s extglob,这会打开扩展通配符。这不是默认行为,需要在脚本中明确启用。详情请见extended pattern matching in the bash hackers wiki

【讨论】:

  • 它启用了一项称为扩展通配符的功能。我会用链接更新答案。
  • 如果没有shopt -s extglob,模式+(-) 是要匹配的4 个字符的字符串,而不是匹配一个或多个- 的模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多