Bash

用於建構參數列表的 Bash 字元串連接

  • August 28, 2014

鑑於這段 bash:

PARMS='-rvu'
PARMS+=" --delete --exclude='.git'"
echo $PARMS
rsync ${PARMS} . ${TARGET}

回顯按預期顯示了 PARMS 字元串,沒有顯示錯誤,但 rsync 默默地表現得好像 += 添加的選項不存在一樣。但是,這可以按預期工作:

PARMS='-rvu'
rsync ${PARMS} --delete --exclude='.git' . ${TARGET}

我想我用 bash 引號搞砸了一些東西(這些引號總是有問題),但即使字元串似乎已正確建構,我也不確定忽略哪些選項以及為什麼忽略這些選項。

兩者之間有區別:

PARMS+="... --exclude='.git'"

... --exclude='.git'

首先,單引號本身就在引號內,因此它們實際上存在rsync作為參數給出的替換文本中。rsync得到一個參數,其值為--exclude='.git'. 在第二個中,單引號在它們被寫入時由 shell 解釋,因為它們本身不在引號內,並且rsync可以看到--exclude=.git.

在這種情況下,你根本不需要單引號——.git它本身就是一個完全有效的 shell 詞,沒有特殊字元,所以你可以在命令中直接使用它。

不過,更適合這種事情的是數組

PARMS=(-rvu)
PARMS+=(--delete --exclude='.git')
rsync "${PARMS[@]}"

這會將您的命令建構為單獨的單詞,並在您編寫數組行時使用您想要解釋的任何引用。"${PARMS[@]}"擴展為數組中的每個條目作為單獨的參數,即使參數本身包含特殊字元或空格,所以rsync會按照您的意思看到您寫的內容。

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