Bash
用於建構參數列表的 Bash 字元串連接
鑑於這段 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
會按照您的意思看到您寫的內容。