Bash

!(*.sh) 在命令行中有效,但在腳本中無效

  • August 5, 2015

當我在 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行下方。

引用自:https://unix.stackexchange.com/questions/220104