2014-10-02 38 views
0

我正在使用linux,下面是我正在尝试的脚本。我想获得最新修改过的文件的文件夹中:bash:脚本即使在使用shopt后也不能正常工作

#!/bin/bash 
shopt -s extglob 
name=$(echo *(om[1])) 
echo $name 

我期待着名而不是*(om[1])回荡。因此,脚本不会因使用shopt而导致任何错误。

我尝试命令行上的命令,它将文件名作为输出。

​​

为什么echo *(om[1])正在commandline但不是在bash script

+1

真正的问题是为什么它从命令行显示“其他”,因为该文件名称与模式不匹配。该脚本看起来是正确的,如果没有匹配的文件名称,则可以从字面上处理该模式。 – chepner 2014-10-02 03:30:48

+0

其他是目录名称。现在你可以看到这个问题,以避免我添加的混淆。 – 2014-10-02 03:44:41

+0

'mumbai123.txt'也不符合该模式。 – chepner 2014-10-02 03:46:18

回答

2

你很困惑zsh glob修饰符与扩展模式。在zsh(您的交互式shell)中,表达式*(om[1])om限定符应用于模式*。在bash中,扩展模式*(om[1])匹配零次或多次出现的模式om[1](与文本字符串“om1”匹配)。由于没有匹配该模式的文件,因此它被直接传递到echo,输出它作为name的值捕获。

+0

谢谢。在文件中,我将#!/ bin/bash改为#!/ bin/zsh并删除了shopt命令。现在它运作良好。 – 2014-10-02 04:02:03

+0

未来,如何在bash中使用它。 – 2014-10-02 04:04:11

+1

你不能; 'bash'没有像'zsh'这样的glob限定符。虽然它并不是真的被推荐,但只要你意识到这将破坏最新文件中名字换行的最罕见情况,你可以使用name = $(ls -t | head -n 1) 。正确的选择要求你在每个文件上调用'stat'以手动编码选择以获得它们的修改时间。 (正如你可能猜到的那样,'zsh' glob限定符*非常有用。) – chepner 2014-10-02 04:13:49

相关问题