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

Bash:变量值中的空格稍后用作参数,bash,Bash,在编写bash脚本以帮助使用Imagick的convertcommmand创建宝丽来缩略图时。我遇到了一个问题。尽管我设法解决了这个问题(实际上,因为convert足够灵活),但我仍然想知道如何在没有这种具体解决方法的情况下解决这个问题 因此基本上,bash脚本将获得一个可能包含空格的标题值。我想将该标题用作convert的参数。如果标题为空(“”),我将不使用convert命令的选项“-caption”。像这样: CAPTION="Is this Cute?" # The actual val

在编写bash脚本以帮助使用Imagick的
convert
commmand创建宝丽来缩略图时。我遇到了一个问题。尽管我设法解决了这个问题(实际上,因为
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命令。但狂欢并没有开始。我怎么能做到

注意:如果是
转换
-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"
我希望这对那些寻求类似解决方案的人有用。

您将希望阅读以下内容:

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

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

  • 我正在基于运行时才知道的信息构造一个命令
  • 上述问题的根源在于,您需要一种方法将每个参数作为一个单独的单词进行维护,即使该参数包含空格。引号不起作用,但数组起作用。(我们在上一节中看到了一些这方面的内容,在这里我们动态构建了addrs数组。)

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


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

    $ c='echo hi'
    $ `$c`
    hi: command not found
    
    这将有助于:

    if [[ "$CAPTION" != "" ]]
    then
        convert -caption "$CAPTION" "$IN_FILE" "$OUTFILE"
    else
        convert "$IN_FILE" "$OUTFILE"
    fi
    
    使用数组,如下所示:

    #!/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[@]}”-标题“$1”)
    以附加到数组中。

    这与我正在做的没有什么不同,也不起作用。无论如何,谢谢你。我相信。它仍然按空格分割标题。首先,传递给脚本的参数应该被引用。然后用引号保留空格。谢谢你的回答。我尝试了一下,它的工作原理是:D,但只在终端。当我把它放在bash文件中时,
    ARGS=(“-caption”“$caption”)
    命令失败,错误消息为“/polaroid.sh:19:语法错误:”(“意外”。你知道这是什么吗?在shebang行中使用
    bash
    ,而不是
    sh
    。真遗憾:(无论如何,感谢您指出这一点。我现在就开始工作了。:d虽然此解决方案有效,但并不实用。想象一下,如果我有更多的参数,我必须以与标题类似的方式处理,例如,背景色、边框色、旋转度等。我们无法为所有缺少的参数创建if。无论如何,谢谢。:-DAs旁白——根据POSIX约定,所有caps变量名都用于对操作系统或shell有意义的变量。脚本应使用至少包含一个小写字符的名称定义自己的变量,以避免与此命名空间冲突。请参阅,请记住,使用以下名称设置常规shell变量:重叠任何现有环境变量都将覆盖后者。
    #!/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"