如何将带空格的参数传递给shell脚本中的外部程序?

时间:2011-08-04 06:49:58

标签: shell shellexecute shell-exec

a.sh

#!/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 个答案:

答案 0 :(得分:1)

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

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

eval $cmd

或只是运行

$binary --description="$description"

答案 1 :(得分:0)

除非您确实有一个名为“测试消息”(名称中有空格)的程序,否则不需要这样做的后面的滴答声:

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

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

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

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

$binary "--description=$description"

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

答案 2 :(得分: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

答案 3 :(得分:0)

安全的方法是use an array

args=("--description=test message" "--foo=some other message")
args+=("--bar=even more")
cmd "${args[@]}"