如何在傳遞給“bash -c”的命令中使用括號的擴充 glob?

如何在傳遞給“bash -c”的命令中使用括號的擴充 glob?

我正在嘗試使用擴展的 glob bash -c,但還沒有找到讓它工作的方法。

我嘗試過的事情

  1. bash -c 'for f in *.!(ext); do echo $f; done'

    結果:

    bash: -c: line 0: syntax error near unexpected token `('
    

     

  2. bash -c 'for f in *.!\(ext\); do echo $f; done'

    結果:

    *.!(ext)
    

     

  3. bash -c 'for f in *.!$0; do echo $f; done' '(ext)'

    結果:

    *.!(ext)
    

     

  4. bash -c 'for f in "*.!(ext)"; do echo $f; done'

    結果:

    *.!(ext)
    

答案1

若要在 中使用擴充的通配模式bash,您必須extglob以一種或另一種方式啟用 shell 選項。

對於內聯腳本執行此操作的最簡單方法是使用命令列上的選項bash -c設定 shell 選項:-O

bash -O extglob -c 'script code here'

您也可以直接致電shopt -s extglob 在腳本內,但您必須確保這是在單獨的行上完成的,因為它改變了 shell 解析程式碼的方式(它修改了 shell 的語法):

bash -c 'shopt -s extglob
         script code here'

至於列印所有不以字串結尾的名稱的實際任務.ext

bash -O extglob -O dotglob -O nullglob -c 'printf "%s\n" !(*.ext)'

透過另外設定dotglobnullglob選項,腳本將匹配隱藏名稱,如果沒有匹配,將列印一個空白行(而不是列印未展開的模式)。

請注意,您的模式將排除以(不僅僅是)*.!(ext)結尾的檔名ext.ext不包含點的檔名。

相關內容