我想生成所有字符串的列表abcd1234
。不用说,abcd
会循环遍历所有字母a
(z
4 次)并1234
循环遍历 0 到 9(4 次)。所有这些字符串我都存储在一个文本文件中。作为第二个愿望,我希望这个程序有一个恢复功能。例如,如果程序停止,那么它应该从停止的地方启动。
通过强力方法(即运行 8 个循环),我能够实现第一部分。(下面的代码)。我知道这是最不好策略。对于改进有什么想法吗?
对于第二部分,我通过选择输出文件的最后一行然后选择每个字符。但是在我的方法中,我遗漏了许多字符串。我知道错误(在我的思维/方法中)在哪里,但我无法纠正它。任何形式的帮助都值得感激!
提前致谢。
我的代码:
#!/bin/bash
outfile=$1
if [ ! -f $outfile ]
then
echo "aaaa0000" > $outfile
fi
lastword=$(tail -1 $outfile)
a_beg=${lastword:0:1}
b_beg=${lastword:1:1}
c_beg=${lastword:2:1}
d_beg=${lastword:3:1}
i_beg=${lastword:4:1}
j_beg=${lastword:5:1}
k_beg=${lastword:6:1}
l_beg=${lastword:7:1}
# echo $a_beg
# echo $b_beg
# echo $c_beg
# echo $d_beg
# echo $i_beg
# echo $j_beg
# echo $k_beg
# echo $l_beg
# echo ""
echo "$a_beg$b_beg$c_beg$d_beg$i_beg$j_beg$k_beg$l_beg"
## This removes the $lastword, as the following loop repeats it!
sed -i '$ d' $outfile
for a in $(eval echo {$a_beg..z})
do
for b in $(eval echo {$b_beg..z})
do
for c in $(eval echo {$c_beg..z})
do
for d in $(eval echo {$d_beg..z})
do
for i in $(eval echo {$i_beg..9})
do
for j in $(eval echo {$j_beg..9})
do
for k in $(eval echo {$k_beg..9})
do
for l in $(eval echo {$l_beg..9})
do
echo "$a$b$c$d$i$j$k$l" >> $outfile
done
done
done
done
done
done
done
done
答案1
我想我可以回答你问题的第一部分。第二部分似乎有点复杂 :-(。
对于第一部分,你可以使用 GNU平行线公用事业。
以下命令可以完成这项工作:
parallel echo ::: {a..z} ::: {a..z} ::: {a..z} ::: {a..z} ::: {0..9} ::: {0..9} ::: {0..9} ::: {0..9} > /tmp/a
希望这可以帮助!
-- 迈克