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

时间:2010-02-12 05:16:21

标签: 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`

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"

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

4 个答案:

答案 0 :(得分:10)

您需要阅读entry 050中的BASH FAQ

  

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

     

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

     

...

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

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

         

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

答案 1 :(得分:2)

使用数组,如下所示:

#!/bin/bash
# ^^^ - note the shebang line explicitly using bash, not /bin/sh

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"

extra_args=( )
if [[ $CAPTION ]] ; then
  extra_args+=( -caption "$1" )
fi
convert "${extra_args[@]}" "$INFILE" "$OUTFILE"

这个结构假定你可能会附加许多额外的参数。请注意,在某些旧版本的bash中不支持+=,这些版本仍然存在于该字段中部署的系统上(最值得注意的是RHEL4)。对于此类较旧的版本,可能需要编写extra_args=( "${extra_args[@]}" -caption "$1" )以附加到数组。

答案 2 :(得分:1)

在最后一行的$COMMAND周围添加反引号会导致脚本尝试执行命令的输出而不是命令本身。

$ c='echo hi'
$ `$c`
hi: command not found

这将有效:

if [[ "$CAPTION" != "" ]]
then
    convert -caption "$CAPTION" "$IN_FILE" "$OUTFILE"
else
    convert "$IN_FILE" "$OUTFILE"
fi

答案 3 :(得分:-1)

CAPTION="$1"
IN_FILE="resources/puppy.png"
OUTFILE="resources/puppy_polaroid.png"

case "$CAPTION" in
  "" ) CAPTION="-caption ''";;
  * ) CAPTION='-caption "$CAPTION"';;
esac

convert $CAPTION "$IN_FILE" "$OUTFILE"