注意 - 我昨天发布了一个类似的问题,并通过 @cas 得到了进一步的信息,但仍然遇到问题。我已经完善了问题,所以重新提出了它。
我将脚本文本传递给 ssh 命令(见下文)。脚本文本内有一些应该扩展的变量。 $1 和 $2 以及 $logfilepattern 似乎在脚本字符串中扩展得很好。然而,$f 却没有。我已经尝试了双引号和单引号的所有组合以及我能想到的转义符,但仍然无法使其工作。任何帮助表示赞赏。
谢谢,麦克斯
#!/bin/bash
logfilepattern="drupal-watchdog.log-201510*.gz"
function getlogcounts {
echo in getlogcounts
echo arg1: "$1"
echo arg2: "$2"
ssh $1 "cd "$2"; pwd; echo "$logfilepattern" ; for f in "$logfilepattern"; do echo "$f"; done"
}
server="[email protected] "
logdir="/var/log/mylogs"
getlogcounts $server $logdir
答案1
如果你想在双引号内包含双引号,那么你必须
- 结束当前的双引号字符串:
"
- 转义双引号:
\"
- 再次开始双引号字符串:
"
换句话说: "\""
在单引号内包含单引号也是如此:'\''
您还需要转义$f
with,\$f
因为它只存在于带引号的字符串脚本中。
ssh $1 "cd "\""$2"\""; pwd; echo "\""$logfilepattern"\"" ; for f in "\""$logfilepattern"\""; do echo "\""\$f"\""; done"
它看起来非常丑陋并且很难阅读和/或调试。
在这种特殊情况下,当您控制函数的输入并且可以合理地确定您不会给它任何可疑的值(包括带空格的文件名)时,如果您愿意,您可以去掉双引号。除了“$f”之外,除非您绝对确定不会有与 $logfilepattern 匹配的文件包含空格或其他有问题的字符。
ssh $1 "cd $2; pwd; echo $logfilepattern ; for f in $logfilepattern; do echo "\""\$f"\""; done"
如果输入以某种方式来自用户,例如在命令行上或来自环境变量(特别是包括 CGI 环境变量),那么您必须(好吧,应该)恢复到引用所有变量的防御风格。
答案2
您可以尝试以下代码:
#!/bin/bash
logfilepattern="drupal-watchdog.log-201510*.gz"
function getlogcounts {
echo in getlogcounts
echo arg1: "$1"
echo arg2: "$2"
ssh $1 "/bin/bash -c ' cd "$2"; pwd; echo "$logfilepattern" ; for f in "$logfilepattern"; do echo \"\$f\"; done'"
}
server="[email protected] "
logdir="/var/log/mylogs"
getlogcounts $server $logdir