我正在尝试编写一个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
进程的输出的临时文件名?
答案 0 :(得分:1)
你的变量args
最后只不过是一个“字符串”,如果你想评估上面的内容,你必须用eval
解析它
eval montage -size 640x480 -geometry +2+2 $args output.jpg
man zshall
:eval [ arg ... ]
读取参数作为shell的输入,并在当前shell进程中执行生成的命令。返回状态 与命令直接执行的命令相同 贝壳;如果没有args 或者它们不包含任何命令(即空字符串或空格),返回状态为零。
它的基本功能是,它将eval
中的各种参数连接在一个以空格分隔的大字符串中,然后由shell执行该字符串。