如何在Bash中循环执行source ./a.sh以遍历所有PIN码?
解决Bash循环执行source脚本尝试PIN码的问题
你的核心问题是之前的写法没有让source ./a.sh在每次循环中独立执行,导致无法逐个尝试PIN码,下面是问题分析和正确实现方式:
你之前代码的问题
- 第一个脚本中,
> output.txt会每次覆盖文件内容,最终只会保留最后一次PIN的执行结果;另外管道传递PIN的方式本身没问题,但如果a.sh没有正确读取stdin的内容,也会失效。 - 第二个脚本中,所有PIN码通过一次性管道传给
source ./a.sh,但source只会执行一次,a.sh只会读取第一行PIN码就结束,后续PIN不会被处理。
正确实现方式
根据a.sh读取PIN码的方式,分两种情况处理:
情况1:a.sh从标准输入(stdin)读取PIN码
如果a.sh是通过read之类的命令从stdin获取PIN,直接在循环内每次单独传递PIN并执行source:
#!/bin/bash # 初始化输出文件(可选,若要追加结果用>>,覆盖用>) > output.txt for pincode in {0000..9999}; do echo "尝试PIN: $pincode" >> output.txt # 将当前PIN传给a.sh,执行结果追加到输出文件 echo "$pincode" | source ./a.sh >> output.txt 2>&1 done
2>&1是把错误输出也写入文件,方便排查问题;如果不需要可以去掉。- 用
>>而不是>,避免每次循环覆盖之前的结果。
情况2:a.sh通过环境变量获取PIN码
如果可以修改a.sh,让它从环境变量读取PIN,这种方式更可靠:
首先修改a.sh,比如用${PINCODE}获取值:
# a.sh中的示例代码 if [ "$PINCODE" = "1234" ]; then echo "PIN正确" else echo "PIN错误" fi
然后主脚本循环设置环境变量并执行source:
#!/bin/bash > output.txt for pincode in {0000..9999}; do echo "尝试PIN: $pincode" >> output.txt # 临时设置环境变量PINCODE,仅在当前source命令生效 PINCODE="$pincode" source ./a.sh >> output.txt 2>&1 done
额外提示
{0000..9999}在Bash中会生成带前导零的4位数字,正好符合PIN码格式。- 如果脚本执行速度慢,可以考虑添加
&后台执行,但要注意输出冲突,建议用单独的日志文件或者锁机制。
内容的提问来源于stack exchange,提问作者Clientic
相关产品推荐
相关产品推荐

