固定構文エラー:「forループ」で予期しないファイルの終わり

固定構文エラー:「forループ」で予期しないファイルの終わり

だから私は何時間もこの問題を直接解決しようとしましたが、問題のあるコードブロックではありませんでした。変更して書き直し、各行の後にエコーを「実行」しようとしましたが、うまくいかないようです。 。ゲーム内の特定のイベントのCSVファイルを復号化するために使用されるコード。必要に応じて、完全なコードは次のようになります。https://pastebin.com/Gv3Fvyxy

for path in $(find assets -name "*.csv")
    do 
    f=$(echo "$path" | rev | cut -d"/" -f1 | rev)
    (
        dd if=$path bs=1 count=9 status=none
        dd if=/dev/zero bs=1 count=4 status=none
        dd if=$path bs=1 skip=9 status=none
    ) | lzma -dc -f > "decrypted/"$f

    done

答え1

このスクリプトの拡張バージョン:

#!/bin/bash

find assets -name '*.csv' -exec bash -c '
    f="$(awk '{print $NF}' <<< "$1")"
    {
        dd if="$1" bs=1 count=9 status=none
        dd if=/dev/zero bs=1 count=4 status=none
        dd if="$1" bs=1 skip=9 status=none
    } | lzma -dc -f > "decrypted/$f"

' -- {} \;
  • 名前にスペースがあるファイルの処理
  • rev|cut|rev簡素化
  • より多くの引用符を使用してください!

シェルから正しく引用する方法を学ぶことは非常に重要です。

スペース/メタ文字を含むすべてのリテラルは「二重引用符」として扱われます。すべて拡張:"$var"、、、、。"$(command "$var")"​コードやテキストについてはを参照してください。"${array[@]}""a & b"'single quotes'$'s: 'Costs $5 US'ssh host 'echo "$HOSTNAME"'
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words

答え2

ここに表示されるスクリプトのバージョンは、Pastebinに公開したスクリプトのバージョンとは異なります。

これコードを貼り付ける次の行があります(57):

    f= $(echo "$path" | rev | cut -d "/" -f1 | rev)

後ろにスペースがありますが=、これは文法的な問題です。

スクリプトがすぐそこ(またはその近く)で失敗する可能性があります。

実際、完全なコード行は次のように単純化できます。

    f=${path##*/}

でも君もいるたくさん小さなコードエラー。ほとんどの問題は、次の提案に従って検出して解決できます。shellcheck.net。そこにスクリプトを貼り付けて整理してください。

まとめられたバージョンは次のとおりです。

#!/bin/bash

Usage(){ echo "Usage: $0 [-n filename.apk]"; exit; }

case $1 in
    -h) Usage;;
    -n) if [ -z "$2" ];then
        echo "You need to insert a filename"
        Usage
    fi
    filename=$2
    ;;
    *)  echo "Give me the clash royale filename"
        read -r filename
    ;;
esac

if [ ! -f "$filename" ];then
    echo "File \"$filename\" not found!"; exit
fi

#Unzipping
echo "Unzipping crash royale apk"
unzip -o -q "$filename" -d "extracted"

#Decrypting
echo "Decrypting csv files"
mkdir decrypted
find assets -name '*.csv' -exec bash -c '
    f="${1##*/}"
    {
        dd if="$1" bs=1 count=9 status=none
        dd if=/dev/zero bs=1 count=4 status=none
        dd if="$1" bs=1 skip=9 status=none
    } | lzma -dc -f > "decrypted/$f"

' sh {} \;

echo "All the decrypted file are stored in the decrypted folder"

#Delete partial files
rm -r extracted

関連情報