1

我确定这很简单。我尝试了多种可能性,但都没有运气。

我正在寻求在 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
4

2 回答 2

2

在脚本中的变量周围加上引号:

./secondexecutable "$tmp" -o outfile.txt

以下是您使用和不使用引号时会发生的情况:

$ cat countargs 
#!/bin/sh

echo $#
$ var='O HAI I IZ A VAR'
$ ./countargs $var
6
$ ./countargs "$var"
1
于 2013-01-02T22:51:18.007 回答
0

在我看来,这是一个糟糕的设计。一旦将多个带有空格的字符串连接成一个字符串,就没有简单的方法可以将它们分开而不回退到eval

eval ./secondexecutable "$tmp" -o outfile.txt

可能会这样做,但要注意评估任意字符串的风险


如果可以,您应该重新处理第一个可执行文件。如果它可以只返回 -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
于 2013-01-03T01:03:15.193 回答