修复语法错误:“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
  • 使用更多引号!

学习如何在shell中正确引用,这非常重要:

“双引号”包含空格/元字符的每个文字以及每一个扩张:"$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

相关内容