Bash扩展:运行文件或在终端// extglob中运行时,结果不同

时间:2019-07-04 14:32:08

标签: linux bash

在某些脚本中,我想使用当前文件夹中的文件夹名称。我想获取文件夹名称,这里只将有问题的部分放在示例中。如果我从终端运行此程序,则会得到:

$ for D in */; do echo ${D%%+(/)} ; done
galaxya8
iphone6s
motog6
motog7

$ echo ${0}
/bin/bash

$ bash --version
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)

但是,如果我将其放入文件中并运行该文件,则会得到带有斜杠的名称:

$ echo 'for D in */; do echo ${D%%+(/)} ; done' >> test.sh

$ bash test.sh
galaxya8/
iphone6s/
motog6/
motog7/

我看到了bash扩展here。我想念什么?也许只是一些交互式shell的默认值?


Minimal, complete and verifiable example(感谢@ kamil-cuk):

$ D=a/; echo ${D%%+(/)}; bash <<<'D=a/; echo ${D%%+(/)}'
a
a/

1 个答案:

答案 0 :(得分:5)

来自bash manual

  

如果使用内置的shopt启用了extglob shell选项,则会识别出几个扩展的模式匹配运算符。   ...

     

+(样式列表)
     匹配给定模式的一个或多个出现。

您需要在脚本中启用extglob shopt选项,以使用扩展模式匹配运算符+(/)

echo 'shopt -s extglob; for D in */; do echo ${D%%+(/)} ; done' > test.sh