我确定这很简单。我已经尝试了许多可能没有运气的可能性。
我想在shell中执行以下操作。
./secondexecutable -t "A string with spaces" -s "Another string with spaces" -o outfile.txt
问题是可执行文件从一个可执行文件中获取一个字符串,然后应用于另一个可执行文件。 第二个可执行文件需要引号(单个或双重)以保留空格。
tmp=`./firstexecutable`
echo $tmp prints out the following -t "A string with spaces" -s "Another string with spaces"
./secondexecutable $tmp -o outfile.txt
shell会截断参数,因此它基本上类似于
./secondexecutable -t "A" -s "Another" -o outfile.txt
答案 0 :(得分:2)
在脚本中的变量周围加上引号:
./secondexecutable "$tmp" -o outfile.txt
以下是您使用和不使用引号时会发生的情况:
$ cat countargs
#!/bin/sh
echo $#
$ var='O HAI I IZ A VAR'
$ ./countargs $var
6
$ ./countargs "$var"
1
答案 1 :(得分:0)
在我看来,这是一个糟糕的设计。将多个字符串与空格连接成一个字符串后,没有简单的方法可以将它们分开而不回退到eval
eval ./secondexecutable "$tmp" -o outfile.txt
可能这样做,但要注意eval'ing任意字符串的风险
如果可以,您应该重新处理第一个可执行文件。如果它可以为-t和-s选项返回值,那么您的生活会更容易。例如,如果它甚至可以在单独的行上输出值,如下所示:
A string with spaces
Another string with spaces
你可以这样做:
{ IFS= read -r t_option; IFS= read -r s_option; } < <(./firstexecutable)
./secondexecutable -t "$t_option" -s "$s_option" -o output.txt
或者,如果两个值不是以某种方式相关,则获取第一个可执行文件以一次计算一个
./second -t "$(./first -t)" -s "$(./first -s)" -o output.txt