0

#!/bin/bash
description=`"test message"` # input parameter for contain a space

binary=<external_prog> # simply display what passes to flag --description

cmd="$binary --description=$description"

$cmd # run the external program

问题:消息会丢失,如何解决?谢谢!

4

4 回答 4

1
#!/bin/bash
description="test message"
binary=program

cmd="$binary --description=\"$description\""

eval $cmd

或者只是运行

$binary --description="$description"
于 2011-08-04T07:11:04.917 回答
0

如果您使用 bash 或 ksh 或一些带有数组的 shell,它们是构建命令的最安全方法。在 bash 中:

description="test message"
binary=some_prog
cmd=( "$binary" "--description=$description" )
"${cmd[@]}"

你可以用这样的东西来测试它:假设它被命名为“arg_echoer.sh”

#!/bin/sh
echo "$0"
i=0
for arg in "$@"; do
    let i="$i+1"
    echo "$i: $arg"
done

然后,如果binary=./arg_echoer.sh,你得到这个输出"${cmd[@]}"

./arg_echoer.sh
1: --description=test message
于 2011-08-04T12:28:41.237 回答
0

除非您确实有一个名为“测试消息”(名称中带有空格)的程序可以生成所需的输出,否则不需要其中的反引号:

description=`"test message"` # input parameter for contain a space

实现您的要求的最简单方法是在需要包含空格的(部分)参数周围使用双引号:

description="test message"
binary=external_prog
$binary --description="$description"

您可以等效地将最后一行写为:

$binary "--description=$description"

这确保了描述中的所有材料都被视为单个参数、空白和全部。

于 2011-08-04T07:21:43.407 回答
0

The safe way is to use an array:

args=("--description=test message" "--foo=some other message")
args+=("--bar=even more")
cmd "${args[@]}"
于 2011-08-04T13:52:11.750 回答