所以我尝试自己解决这个问题几个小时,但我不能这是有问题的代码块,我更改了它,重写了它,我什至尝试在每行之后仅“执行”回显,但它没有似乎有效。它是用于解密游戏中某些事件的 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
为awk - 使用更多引号!
学习如何在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