그래서 나는 몇 시간 동안 이 문제를 직접 해결하려고 노력했지만 문제가 있는 코드 블록일 수는 없었습니다. 변경하고 다시 썼으며 심지어 각 줄 뒤에 에코를 "실행"하려고 시도했지만 작동하지 않는 것 같습니다. . 게임 내 특정 이벤트의 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