Bash

Bash 腳本轉義引號

  • October 6, 2021

我正在編寫一個 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’**字元串。

您可能正在尋找一種辨識損壞圖像的方法。查詢該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語句檢測到。我們丟棄轉換操作的結果。

引用自:https://unix.stackexchange.com/questions/672175