Bash
無法在 bash 變數中執行命令,包括帶有 nullglob 的方括號
假設我想在打開 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