bash脚本具有以下行
rsync $OPTS $BACKDIR $USER@$DEST:$DESTDIR
但其中一个选项是rsh =’ssh -p2222′
它抱怨说:
rsync: -p2222': unknown option rsync error: Syntax or usage error (code 1) at main.c(1425) [client=3.0.7]
但是当我将脚本更改为:
echo rsync $OPTS $BACKDIR $USER@$DEST:$DESTDIR
并手动运行它工作的打印命令.
请指教
简答:见
BashFAQ #50.
原文链接:https://www.f2er.com/bash/385503.html答案很长:将命令(或命令的一部分)放入变量中,然后将它们完整地取出是很复杂的.当shell在命令行上扩展变量时,如果变量是双引号,则不解析它(参见@Dennis Williamson的答案);如果它不在引号中,则其中的空格将被解析为参数中断,但不会解析引号和转义(这就是为什么在rsync中的某个args中出现了关于文字引号的错误).在任何一种情况下,将引号放在变量的值中没有任何用处.
但是,有几种方法可以修复脚本,具体取决于OPTS的复杂程度:
>如果–sh是OPTS中唯一的东西,那么双引它(如Dennis Williamson的回答):
OPTS='--rsh=ssh -p2222' rsync "$OPTS" "$BACKDIR" "$USER@$DEST:$DESTDIR"
(注意其他args周围的双引号:这是为了防止错误,如果它们包含空格,并且通常是良好的脚本卫生.)
>如果OPTS的内容是常量(或至少是–rsh部分),那么不要试图将它放在变量中,只需直接使用它:
rsync --rsh='ssh -p2222' $RESTOFOPTS "$BACKDIR" "$USER@$DEST:$DESTDIR"
>如果这些简单情况都不适用,请使用数组而不是普通变量:
OPTS=(-x --delete --inplace) if [[ "$rsync_version" == 2.* ]]; then OPTS+=(-aE) else OPTS+=(-aNHX) fi if [[ -n "$using_rsh" ]]; then OPTS+=('--rsh=ssh -p2222') fi rsync "${OPTS[@]}" "$BACKDIR" "$USER@$DEST:$DESTDIR"