Bash:变量值中的空格稍后用作参数

Naw*_*Man 6 bash

在编写bash脚本时,使用Imagick的命令帮助创建宝丽来缩略图convert.我遇到了一个问题.虽然,我设法解决这个问题(实际上,因为convert足够灵活),我仍然想知道如何在没有这种具体解决方法的情况下解决这个问题.

所以基本上,bash脚本将获得可能包含空格的标题值.我想使用该标题作为参数convert.如果标题为空(''),我将不会对convert命令使用'-caption'选项.像这样:

CAPTION="Is this Cute?" # The actual value will be tacked from the parameter of this bash.
IN_FILE="resources/puppy.png"
OUTFILE="resources/puppy_polaroid.png"

# If CAPTION is not empty, reformat CAPTION
if [ "$CAPTION" != "" ]; then CAPTION="-caption \"$CAPTION\""; fi
# otherwise, do not use '-caption' add all

COMMAND="convert $CAPTION \"$IN_FILE\" \"$OUTFILE\""
echo "Command: $COMMAND" #This echo a value command
`$COMMAND`
Run Code Online (Sandbox Code Playgroud)

echo回显了可以复制的value命令,可以粘贴到终端并运行.但是bash没有运行.我怎么能这样做?

注意:如果是convert,-caption ""请完成工作.我知道这一点,目前正在使用它作为解决方法.

在此先感谢您的帮助.

编辑:从答案,这里是现在适合我的代码.

... # Get CAPTION and GRAVITY from parameters

if [ "$CAPTION" != "" ]; then ARGS_CAPTION=(-caption "$CAPTION"); fi
if [ "$GRAVITY" != "" ]; then ARGS_GRAVITY=(-gravity "$GRAVITY"); fi

if [ ! -f "$IN_FILE"  ]; then echo "The input file does not exist: '$IN_FILE'"; exit; fi
if [ "$OUTFILE" == "" ]; then OUTFILE=${IN_FILE%.*}-${IN_FILE#*.}-polaroid.png; fi

ARGS=("${ARGS_CAPTION[@]}" -thumbnail 480x480 -border 5x5 -pointsize 60 "${ARGS_GRAVITY[@]}" +polaroid -thumbnail 120x120)
echo convert "${ARGS[@]}" "$IN_FILE" "$OUTFILE";
convert "${ARGS[@]}" "$IN_FILE" "$OUTFILE"
Run Code Online (Sandbox Code Playgroud)

我希望这对寻求类似解决方案的人有用.

Ign*_*ams 10

您需要阅读BASH FAQ中的条目050:

我试图将命令放在变量中,但复杂的情况总是失败!

变量保存数据.函数保存代码.不要把代码放在变量中!在许多情况下,人们试图将命令或命令参数推入变量然后运行它们.每个案例都需要单独处理.

...

  1. 我正在构建一个基于仅在运行时知道的信息的命令

上面描述的问题的根源是你需要一种方法来将每个参数维护为一个单独的单词,即使该参数包含空格.行情不会这样做,但数组会.(我们在上一节中看到了一点,我们在运行中构建了addrs数组.)

如果需要动态创建命令,请将每个参数放在数组的单独元素中.带有数组的shell(比如Bash)使这更容易.POSIX sh没有数组,因此最接近的是在位置参数中建立元素列表.这是上一节中sendto函数的POSIX sh版本:

  • 在你的shebang线上使用`bash`,而不是`sh`. (2认同)