命令不作为变量执行?

时间:2014-07-09 16:21:13

标签: bash shell imagemagick-convert

每当我尝试执行以下shell命令时,它都能正常工作。

convert maanavulu_GIST-TLOTKrishna.tif -alpha set -matte -virtual-pixel transparent -set option:distort:viewport 1000x1000 -distort perspective-projection '1.06,0.5,0,0,1.2,0,0,0' -trim 1.jpg

但是,每当我尝试将命令分配给变量然后执行它时,它会报告以下错误。

convert.im6: invalid argument for option PerspectiveProjection : 'Needs 8 coefficient values' @ error/distort.c/GenerateCoefficients/873.

3 个答案:

答案 0 :(得分:3)

缺点:它最好:

  • 参数存储在数组
  • 中 为了安全起见,
  • 包括命令本身(优于eval解决方案)
  • 然后使用数组
  • 调用该命令
# Store options in array - note that the filenames are excluded here, too,
# for modularity
opts=(-alpha set -matte -virtual-pixel transparent -set option:distort:viewport \
      1000x1000 -distort perspective-projection '1.06,0.5,0,0,1.2,0,0,0' -trim)

# Invoke command with filenames and saved options
convert maanavulu_GIST-TLOTKrishna.tif "${opts[@]}" 1.jpg

事后补充:正如@konsolebox和@chepner所指出的那样:使用函数可能是最好的选择(固定和可变部分之间的明确分离,封装,全方位的shell命令可用)。

答案 1 :(得分:1)

分配和执行命令的正确方法是使用数组:

COMMAND=(convert maanavulu_GIST-TLOTKrishna.tif -alpha set -matte -virtual-pixel transparent -set option:distort:viewport 1000x1000 -distort perspective-projection '1.06,0.5,0,0,1.2,0,0,0' -trim 1.jpg)

然后执行它:

"${COMMAND[@]}"

我喜欢eval,但这次绝对不是解决方案。

只是一个提示:如果你可以使用一个功能,请使用一个功能。并正确引用你的论点。

答案 2 :(得分:0)

扩展变量后不会处理引号。唯一出现的处理是分词和通配符扩展。如果需要执行命令执行的所有常规步骤,则必须使用eval

eval "$variable"