数组元素

时间:2018-02-14 22:25:38

标签: zsh

我正在尝试编写一个zsh脚本,该脚本将一个或多个URL作为参数,并为每个URL运行一个命令(在本例中为ImageMagick montage命令)。目标是能够创建一组URL的蒙太奇。

我当然可以下载每个网址并将生成的文件名传递给montage,但zsh的进程替换似乎会简化一些事情。

如果我只是手动执行一组URL,那很容易:

montage -size 640x480 -geometry +2+2            \
     =(curl -s https://i.imgur.com/fSgnUKW.jpg) \
     =(curl -s https://i.imgur.com/6xIgEx2.jpg) \
     output.jpg

但是在我想把URL作为参数的脚本中,我无法弄清楚如何让它工作。

我知道a${^foo}b诀窍可以做一些列表理解的事情,所以我可以这样做:

local -a urls
urls=(https://i.imgur.com/fSgnUKW.jpg https://i.imgur.com/6xIgEx2.jpg)
echo "=(curl -s "${^urls}")"

产生这个输出:

=(curl -s https://i.imgur.com/fSgnUKW.jpg) =(curl -s https://i.imgur.com/6xIgEx2.jpg)

这正是我在上面的montage命令行中想要的,但我不能这样做:

local -a args
args=('=(curl -s '${^urls}')')
montage -size 640x480 -geometry +2+2 $args output.jpg

如果我用zsh -x运行这些命令,我​​会看到:

+./foo:12> montage -size 640x480 -geometry +2+2 '=(curl -s https://i.imgur.com/fSgnUKW.jpg)' '=(curl -s https://i.imgur.com/6xIgEx2.jpg)' output.jpg

换句话说,它似乎在扩展它们时引用args的元素。我想要它做的只是将它们放在没有引号的情况下,并进行进程替换,以便=(curl -s ...)执行并返回输出的文件名。

我发现有一个“参数扩展标记”(Q)表示它会从结果中删除引号级别,但会将最后一行更改为:

montage -size 640x480 -geometry +2+2 ${(Q)args} output.jpg

无济于事 - 我怀疑是因为它是一个数组。有没有办法扩展数组元素,没有引号,并进行进程替换,以便我得到每个curl进程的输出的临时文件名?

1 个答案:

答案 0 :(得分:1)

你的变量args最后只不过是一个“字符串”,如果你想评估上面的内容,你必须用eval解析它

eval montage -size 640x480 -geometry +2+2 $args output.jpg       
  

man zshall eval [ arg ... ]

     

读取参数作为shell的输入,并在当前shell进程中执行生成的命令。返回状态   与命令直接执行的命令相同   贝壳;如果没有args                 或者它们不包含任何命令(即空字符串或空格),返回状态为零。

它的基本功能是,它将eval中的各种参数连接在一个以空格分隔的大字符串中,然后由shell执行该字符串。