Bash:变量值中的空格稍后用作参数
在编写bash脚本以帮助使用Imagick的Bash:变量值中的空格稍后用作参数,bash,Bash,在编写bash脚本以帮助使用Imagick的convertcommmand创建宝丽来缩略图时。我遇到了一个问题。尽管我设法解决了这个问题(实际上,因为convert足够灵活),但我仍然想知道如何在没有这种具体解决方法的情况下解决这个问题 因此基本上,bash脚本将获得一个可能包含空格的标题值。我想将该标题用作convert的参数。如果标题为空(“”),我将不使用convert命令的选项“-caption”。像这样: CAPTION="Is this Cute?" # The actual val
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"
我希望这对那些寻求类似解决方案的人有用。您将希望阅读以下内容:
我试图将命令放入变量中,但复杂的情况总是失败
变量保存数据。函数保存代码。不要把代码放在变量里面!在许多情况下,人们试图将命令或命令参数塞进变量中,然后运行它们。每个案件都需要单独处理
在最后一行的
$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"