Bash 脚本转义引号

Bash 脚本转义引号

我正在编写一个 bash 脚本来查找文件夹中的所有图像,并使用 ImageMagick 查找它们是否有损坏的结尾。

这是我试图自动化的命令:

identify -verbose *.jpg 2>&1 | grep "Corrupt" | egrep -o "([\`].*[\'])"

我遇到的问题是将识别命令存储到变量中。

命令中存在多种类型的引号我不断收到错误第 8 行:损坏:找不到命令

#!/bin/bash
# This script will search for all images that are broken and put them into a text file

FILES="*.jpg"

for f in $FILES
do
  corrupt = "identify -verbose \"$f\" 2>&1 | grep \"Corrupt\" | egrep -o \"([\`].*[\'])\""

  if [ -z "$corrupt" ]
  then
    echo $corrupt
  else
    echo  "not corrupt"
  fi
done

有没有办法正确地逃避该命令?

更新:

一些进展:

#!/bin/bash
# This script will search for all images that are broken and put them into a text file

FILES="*.jpg"

for f in $FILES
do
  echo "Processing $f"
  corrupt="identify -verbose $f 2>&1 | grep \"Corrupt\" | egrep -o \"([\`].*[\'])\""

  if [ -z "$corrupt" ]
  then
    echo $corrupt
  else
    echo  "not corrupt"    
  fi

done

这不再抛出错误,但看起来它只是将变量存储为字符串。

我怎样才能运行这个命令?

更新:一些进展。现在命令正在运行:

#!/bin/bash
# This script will search for all images that are broken and put them into a text file

FILES="*.jpg"

for f in $FILES
do
  echo "Processing $f"

  corrupt=`identify -verbose $f | grep \"Corrupt\" | egrep -o \"([\`].*[\'])\"`

  $corrupt

  if [ -z "$corrupt" ]
  then
    echo $corrupt
  else
    echo  "not corrupt"    
  fi

done

但管道的输出是分开的:

Processing sdfsd.jpg
identify-im6.q16: Premature end of JPEG file `sdfsd.jpg' @ warning/jpeg.c/JPEGWarningHandler/387.
identify-im6.q16: Corrupt JPEG data: premature end of data segment `sdfsd.jpg' @ warning/jpeg.c/JPEGWarningHandler/387.

我只需要决赛`sdfsd.jpg'细绳。

答案1

您可能正在寻找一种识别损坏图像的方法。可以轻松查询该identify工具的退出状态,看看它是否能够识别图像文件。

#!/bin/sh

for name in *.jpg; do
    if identify -regard-warnings -- "$name" >/dev/null 2>&1; then
        printf 'Ok: %s\n' "$name"
    else
        printf 'Corrupt: %s\n' "$name"
    fi
done

上面使用退出状态来identify确定文件是否损坏。选项-regard-warnings将您提到的警告升级为错误,这会使它们影响实用程序的退出状态。

您很少需要在变量中存储实际的通配模式。您通常可以通过测试实用程序的退出状态(如我们上面所示)来获取实用程序的成功/失败状态,而无需解析工具的输出。

对于较旧的 ImageMagick 版本(我使用的是 6.9.12.19),请使用convert而不是identify.

#!/bin/sh

for name in *.jpg; do
    if convert -regard-warnings -- "$name" - >/dev/null 2>&1; then
        printf 'Ok: %s\n' "$name"
    else
        printf 'Corrupt: %s\n' "$name"
    fi
done

上面的循环尝试转换每个图像,如果处理图像文件失败,则由语句检测到if。我们丢弃转换操作的结果。

相关内容