编写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"
我希望这对寻求类似解决方案的人有用。
答案 0 :(得分:10)
我正在尝试将命令放在变量中,但复杂的情况总是会失败!
变量保存数据。函数保存代码。不要把代码放在变量中!在许多情况下,人们试图将命令或命令参数推入变量然后运行它们。每个案例都需要单独处理。
...
- 我正在构建一个基于仅在运行时知道的信息的命令
醇>上述问题的根源在于您需要一种方法将每个参数维护为单独的单词,即使该参数包含空格。行情不会这样做,但数组会。 (我们在上一节中看到了一点,我们在运行中构建了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"