Bash

無法在 bash 變數中執行命令,包括帶有 nullglob 的方括號

  • September 17, 2015

假設我想在打開 nullglob 的情況下執行儲存在變數中的 commnand。例如:

shopt -s nullglob
a="echo [foo]bar"
${a}

當然,由於 nullglob 選項,這給了我一個空輸出,但我想要以下輸出(我無法獲得):

[foo]bar

我試著逃跑

$$ $$與 \ 但這只是給了我:

\[foo\]bar

逃避它的正確方法是什麼?

編輯(在某些情況下進行澄清):

我有一個這樣的腳本:

shopt -s nullglob
for file in tmp/*.pdb; do
   base="$(basename ${file} .pdb)"
   a="command --option [${base}]foo"
   ${a}
done
shopt -u nullglob

我想要實現的是為每個文件執行命令,該選項具有

$$ $$作為普通字元(沒有任何匹配)。這裡的 nullglob 僅用於 for 循環。 也就是說,如果“tmp”包含“a.pdb”執行:

command --option '[a]foo'

如果沒有這樣的文件,則什麼都沒有。

與此同時,我發現將“shopt -u nullglob”作為 for 循環中的第一個命令移動似乎可以解決問題。但是,我很好奇我是否能以某種方式逃脫

$$ $$即使使用 nullglob。

首先,請閱讀我正在嘗試將命令放入變數中,但複雜的情況總是失敗!.

然後,定義一個函式:

a () {
   echo "[foo]bar"
}

對於您的腳本,沒有理由先將命令放在變數中;只需執行命令。

shopt -s nullglob
for file in tmp/*.pdb; do
   base="$(basename ${file} .pdb)"
   command --option "[${base}]foo"
done
shopt -u nullglob

如果您必須在變數中儲存某些內容,請將命令與其選項分開,並使用數組來保存選項。

shopt -s nullglob
cmd=command
for file in tmp/*.pdb; do
   base="$(basename ${file} .pdb)"
   options=( --option "[${base}]foo" )
   "$cmd" "${options[@]}"
done
shopt -u nullglob

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