bash string作为引号中可执行文件的参数

时间:2013-01-02 22:48:21

标签: bash arguments echo double-quotes

我确定这很简单。我已经尝试了许多可能没有运气的可能性。

我想在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

2 个答案:

答案 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