编写 shell 脚本时如何用反引号引用命令

编写 shell 脚本时如何用反引号引用命令

以下脚本中执行的命令有效:

#!/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,感谢提供有用的链接。

相关内容