以下脚本中执行的命令有效:
#!/bin/bash -xv
REM_DIR="/home/jan/rem-dir"
SSHOPTS="-C -c arcfour256 -o "\""ServerAliveInterval 15"\"
SSHUSER="[email protected]"
CMD="ssh $SSHOPTS \"$SSHUSER\" \"find \\\"$REM_DIR/\\\" -path *lost+found -prune -o -type f -printf \\\"%P\\\\n\\\"\""
REM_FILES=`eval $CMD`
它基本上在远程主机上执行此操作:
find "/home/jan/rem-dir/" -path *lost+found -prune -o -type f -printf "%P\n"
但是如果我想要这样的话应该如何转义/格式化:
REM_FILES=`ssh ...`
或者:
REM_FILES=$(ssh ...)
虽然我当前的脚本运行良好,但我想知道在编写 shell 脚本时如何正确地转义/引用。
答案1
更好的方法是:
#!/bin/bash -xv
REM_DIR="/home/jan/rem-dir"
SSHOPTS=(-C -c arcfour256 -o "ServerAliveInterval 15")
SSHUSER="[email protected]"
REM_FILES=`ssh "${SSHOPTS[@]}" "$SSHUSER" "find \"$REM_DIR/\" -path \"*lost+found\" -prune -o -type f -printf \"%P\\n\""`
主要问题出在 $SSHOPTS 上,诀窍是将每个参数放在数组的单独元素中。
@Dennis,感谢提供有用的链接。