带双引号的参数列表在Bash中无法正确传递

时间:2012-04-11 23:10:18

标签: string bash

我有一个调用另一个Bash脚本的Bash脚本。被调用的脚本会做一些修改并检查一些事情,转移,然后通过调用者命令行的其余部分。

在被调用的脚本中,我已经确认我已经管理好所有内容并准备好调用。这是我放入的一些调试样式代码:

echo $SVN $command $@ > /tmp/shimcmd
bash /tmp/shimcmd
$SVN $command $@

现在,在/ tmp / shimcmd中你会看到:

svn commit --username=myuser --password=mypass --non-interactive --trust-server-cert -m "Auto Update autocommit Wed Apr 11 17:33:37 CDT 2012"

也就是说,内置命令,全部在一行,完全没问题,包括-m“我的字符串有空格”部分。

这很完美。并且它的“bash / tmp / shimcmd”执行也很完美。

但当然我不想要这个愚蠢的tmp文件等(只用它来调试)。问题是直接调用命令,而不是通过shim文件:

$SVN $command $@

导致svn命令本身没有接收带空格的带引号的字符串 - 它使用空格“'参数将'-m'字符串变为乱码,并将命令作为'-m my string with spaces'传递给它

我尝试过各种各样的疯狂逃生方法无济于事。简直不敢相信这是困扰我的。再次,通过向文件回显相同的事物($ SVN $ command $ @)然后执行该文件,它很精细。但直接调用会引用引用的字符串。那个元素本身就是小腿。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

这是一种证明问题的方法:

$ args='-m "foo bar"'
$ printf '<%s> ' $args
<-m> <"foo> <bar">

这是一种避免它的方法:

$ args=( -m "foo bar" )
$ printf '<%s> ' "${args[@]}"
<-m> <foo bar>

在后一种情况下,args是一个数组,而不是带引号的字符串。

顺便说一句,请注意,它必须是"$@"而不是$@才能获得此行为(避免使用字符串拆分以支持尊重数组条目的边界)。

答案 1 :(得分:0)

你有没有尝试过:

eval "$SVN $command $@"

答案 2 :(得分:0)

echo -n -e  $SVN \"$command\"  > /tmp/shimcmd
for x in "$@"
  do
     a=$a" "\"$x\"
  done
echo -e " " $a >> /tmp/shimcmd
bash /tmp/shimcmd

或只是

$SVN "$command" "$@"