Bash
!(*.sh) 在命令行中有效,但在腳本中無效
當我在 Ubuntu 的終端中使用下面的程式碼時,它工作正常:
rm !(*.sh) -rf
但是,如果我將相同的行程式碼放在 shell 腳本(
clean.sh
)中並從終端執行 shell 腳本,它會拋出錯誤,因為clean.sh 腳本:
#!/bin/bash rm !(*.sh) -rf
我得到的錯誤:
./clean.sh: line 2: syntax error near unexpected token `(' ./clean.sh: line 2: `rm !(*.sh) -rf'
你能幫我嗎?
你需要開啟
extglob
:shopt -s extglob
在 bash 中,預設情況下不啟用某些模式,但可以通過使用
shopt
. 早期 Unix shell 中不存在的模式!(NOT-THIS)
、@(THIS|THAT)
、和*(ZERO-OR-MORE)
,後來被添加到 ksh 中,並且沒有被 POSIX 標準化,預設情況下無法辨識,您必須先執行。+(ONE-OR-MORE)``?(OPTIONAL)``shopt -s extglob
您可以在命令行上使用這些模式;這表明你
shopt -s extglob
在你的.bashrc
. 該文件只能由互動式 shell 讀取,而不是由腳本讀取。(如果在 bash 開始執行腳本時設置了環境變數
BASH_ENV
,那麼 bash 會讀取它指定的文件,但我不建議依賴它,因為它只會在BASH_ENV
設置為您期望的值時使您的腳本工作,並且僅當您不更改它指向的文件時。)只需包含
shopt -s extglob
在腳本頂部的#!/bin/bash
行下方。