Как передать параметр с пробелом во внешнюю программу в сценарии оболочки? - PullRequest
0 голосов
/ 04 августа 2011

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 ]

1 голос
/ 04 августа 2011
#!/bin/bash
description="test message"
binary=program

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

eval $cmd

или просто запустить

$binary --description="$description"
0 голосов
/ 04 августа 2011

Безопасный способ - использовать массив :

args=("--description=test message" "--foo=some other message")
args+=("--bar=even more")
cmd "${args[@]}"
0 голосов
/ 04 августа 2011

Если вы используете bash или ksh или какую-либо оболочку с массивами, это самый безопасный способ создания команды. В баш:

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
0 голосов
/ 04 августа 2011

Обратные пометки в этом не нужны, если только у вас действительно нет программы под названием «тестовое сообщение» (с пробелом в имени), которая генерирует желаемый результат:

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

Самый простой способВы должны использовать двойные кавычки вокруг аргумента (части), который должен содержать пробелы:

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

Вы могли бы эквивалентно написать последнюю строку как:

$binary "--description=$description"

Этогарантирует, что весь материал в описании рассматривается как единый аргумент, пробелы и все.

...