0

我有一个调用另一个 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 "my string with spaces" 部分。

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

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

$SVN $command $@

导致 svn 命令本身不接收带空格的引号字符串——它使“-m “我的带空格的字符串”参数乱码,并把命令当作“-m 我的带空格的字符串”传递。

我尝试了各种疯狂的逃生方法,但都无济于事。不敢相信它这么严重地缠着我。同样,通过将相同的内容 ($SVN $command $@) 回显到文件然后执行该文件,就可以了。但是直接调用会使引用的字符串出现乱码。仅此元素即可。

有任何想法吗?

4

3 回答 3

0

这是演示问题的一种方法:

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

这是一种避免它的方法:

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

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

请注意,顺便说一句,它必须是"$@",而不是$@,才能获得这种行为(其中避免了字符串拆分,有利于尊重数组条目的边界)。

于 2012-04-11T23:26:15.097 回答
0

你试过了吗:

eval "$SVN $command $@"

?

于 2012-04-11T23:29:06.533 回答
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" "$@"
于 2012-04-11T23:41:35.417 回答