2014-10-02 71 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

相關問題