當我在命令行上使用rm -r secrets/!(snapsearch)
時。它工作並刪除除snapsearch文件夾以外的祕密文件夾中的所有內容。在shell腳本中使用括號/ parantheses vs從命令行使用它們bash
但是,當我在bash腳本中使用完全相同的命令並執行它時,它會抱怨括號。
syntax error near unexpected token `('
它爲什麼從命令行工作,而不是從bash腳本?我怎樣才能從bash腳本中完成這項工作?
當我在命令行上使用rm -r secrets/!(snapsearch)
時。它工作並刪除除snapsearch文件夾以外的祕密文件夾中的所有內容。在shell腳本中使用括號/ parantheses vs從命令行使用它們bash
但是,當我在bash腳本中使用完全相同的命令並執行它時,它會抱怨括號。
syntax error near unexpected token `('
它爲什麼從命令行工作,而不是從bash腳本?我怎樣才能從bash腳本中完成這項工作?
您需要以非交互模式啓用extglob
,即執行腳本時。
您有兩種選擇。首先,下面一行添加到您的腳本的頂部:
shopt -s extglob
注意,由於extglob
改變其表達式解析的方式,因此它需要單獨放置在一個單獨的行並不能成爲其中的一部分一個塊,例如一個if
塊。
其次,說執行腳本:(第二個選項不要求更改劇本)
bash -O extglob scriptname
這是否防止語法錯誤?還是我需要逃避它? – CMCDragonkai
@CMCDragonkai你不需要執行任何類型的轉義,如果你做任何一個。 – devnull
好的真棒謝謝。 – CMCDragonkai
你嘗試逃跑呢? '\(snapsearch \)' – Carlo
是的,它也不起作用。它返回'rm:不能刪除'secrets /!(snapsearch)':沒有這樣的文件或目錄'它肯定存在!並且從CLI運行時工作正常! – CMCDragonkai