2012-02-26 98 views
3

我创建了一个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  }得到执行,这是不正确的。

为什么\\

回答

3

为什么需要两个反斜杠这里?我需要一个防止shell试图扩展$ 1,但除此之外,我们只在一组单引号内工作,这不应该混淆斜杠的数量。

这里包括两个壳里面做所有常见的变量/路径substitions /扩展,一个是

bash -c 

另一个是反引号操作符:

`command` 

你需要另一个防止扩张$1

-2

双反斜线可确保一个反斜杠将被打印的内容的一部分,换句话说,如果$1存放值“XYZ”的剧本将打印\xyz

+1

不,双反斜杠确保打印变量:在一个或两个反斜杠的情况下,反斜杠实际上是输出。在单个反斜杠的情况下,'$ 1'由'bash'评估 - 这是无意识的,因为它没有值,所以awk得到'{print}',这是错误的。在两个反斜杠的情况下,awk获得'{print $ 1}'和'$ 1'(根据需要)由'awk'评估。 – Thanatos 2012-02-26 11:32:27

+0

感谢您的纠正 - 在回答之前我没有深入了解...... – 2012-02-26 11:39:59

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 ' {}