Bash
命令參數的 Shell 字元串轉義
我正在嘗試用這個創建“/tmp/pwet/foo bar”:
DIR="/tmp/pwet/foo bar" ARGS="-p ${DIR}" mkdir $ARGS
出於集成原因,我必須將 ARGS 建構分為 2 個步驟: ARG = some_options + $DIR 此程式碼創建 2 個目錄:
/tmp/pwet/foo
和./bar
. 這不是我想要的。我嘗試了很多逃避的事情,但沒有結果。我用 bash 執行腳本。有什麼好的解決辦法?
問題不在於變數的內容(這就是為什麼您可以嘗試使用任意數量的轉義字元),而在於 bash 替換
$ARGS
為變數內容的事實,因此其中的空間將是實際的命令中的空格。只需使用
mkdir "$ARGS"
(即,將變數引用包含在"
s 中)更新:如評論中所述,為了使 the
-p
和其他選項不屬於目錄名稱,請改為定義 2 個變數:
OPTS="-p -whatever"
和ARGS="/tmp/pwet/foo bar"
然後像這樣發出 mkdir :
mkdir $OPTS "$ARGS"
或者,如果您想使用轉義字元完全控制它,並且可能有多個目錄,有些帶有空格,有些沒有,選項,所有混合在一起,您可以將整個命令放在一個變數中並使用 bash -c 執行它。
檢查下面的範例作為您可以玩的起點:
MKDIRCMD="mkdir -p \"A B\" \"C D\"" echo $MKDIRCMD # Notice the \ characters are NOT part of the string bash -c "$MKDIRCMD"