我创建了一个bash
脚本来缩放树中的所有图像。它是以下内容:
#!/bin/bash
find -path "thumbnails/" -prune -or -iname "*.jpg" -exec \
bash -c 'convert "$0" -resize 256x256 thumbnails/`sha512sum "$0" | awk "{ print \\$1 }"`.jpg' {} \;
# ^^
在awk命令中,有一个双\\
。 (我在注释行上用^^
标记了它,但你可能需要滚动→)为什么我在这里需要两个反斜杠?我需要一个来防止shell尝试扩展$1
,但除此之外,我们只在一组单引号内工作,这不应该与斜杠的数量相混淆。然而,只有一个反斜杠,awk { print }
被执行,这是不正确的。
为何选择\\
?
答案 0 :(得分:3)
为什么我需要两个反斜杠?我需要一个来阻止shell尝试扩展$ 1,但是否则,我们只在一组单引号中工作,这不应该与斜杠的数量相混淆。
这里实际上有两个shell可以执行所有常见的变量/路径变换/扩展,一个是
bash -c
另一个是反击操作符:
`command`
您需要再次强烈反对,以防止扩展$1
。
答案 1 :(得分:0)
您想要运行
convert "$0" -resize 256x256 thumbnails/`sha512sum "$0" | awk "{ print \$1 }"`.jpg {}
通过bash -c
为每个文件。因此,当您将命令添加为bash
的参数时,请使用单引号''
进行包装。在这种情况下,您需要使用一个反斜杠转义反斜杠。那是
bash -c 'convert "$0" -resize 256x256 thumbnails/`sha512sum "$0" | awk "{ print \\$1 }"`.jpg ' {}
答案 2 :(得分:-2)
双反斜杠确保单个反斜杠将成为打印内容的一部分,换句话说,如果$1
保持值“xyz”,则脚本将打印\xyz