我有一个调用另一个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 $ @)然后执行该文件,它很精细。但直接调用会引用引用的字符串。那个元素本身就是小腿。
有什么想法吗?
丹
答案 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" "$@"