我有这个 bash 脚本,可以使用不同的密码解压文件。但它会无限解压,并损坏解压后的文件
PASS="passfoo passbar passfoobar"
LIST=$(ls -1 *.{zip,7z,7z.001,rar})
for password in $PASS; do
OIFS="$IFS"
IFS=$'\n'
for i in $LIST
do
echo "$password"
7z x -y -p"$password" "$i" -aoa
if [ $? -eq 0 ]; then
continue
fi
done
IFS="$OIFS"
done
为了暂时解决这个问题,我不得不为每个密码创建一个循环。
我想要的是当脚本匹配一个密码时,脚本不会测试其他密码,并且如果没有任何密码匹配则尝试正常解压缩(如果它没有密码)或显示错误(如果文件有密码但不在变量中)而不停止解压缩其他文件。谢谢
PD:请记住,要解压的文件有时带有空格和其他非 ASCII 字符的名称,或者是按部分压缩的文件
答案1
不确定continue
内循环内的操作是否正确,但我已针对此调整了您的代码。
#!/usr/bin/env bash
shopt -s extglob nullglob
passw=(
passfoo
passbar
passfoobar
banana
chocolate
whiskey
vodka
icecream
)
for f in *.@(zip|7z|7z.001|rar); do
for p in "${passw[@]}"; do
if 7z x -y -p"$p" "$f" -aoa; then
break
fi
done
done
启用
shopt -s
默认情况下未启用的 shell 选项,shopt -u
禁用选项。extglob
此功能可让您*.@(zip|7z|rar)
匹配不同的文件扩展名。它扩展为*.zip
*.7z
并*.rar
扩展为目录中以该特定扩展名结尾的所有文件(如果有文件),但不确定顺序。nullglob
如果没有以模式结尾的文件,*.@(zip|7z|rar)
则不会评估任何内容,因此它将为空,如果未启用,则 glob 将扩展为文字*.rar
或*.7z
或*.zip
将导致脚本出现错误。
编辑:根据 OP 的 @ajcg ,我已继续中断以使其按预期工作。