我想生成的所有字符串的列表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
我想我可以回答您问题的第一部分。第二部分似乎有点复杂:-(。
对于第一部分,您可以使用GNU并行实用程序来代替运行这些循环。
以下命令可以完成这项工作:
parallel echo ::: {a..z} ::: {a..z} ::: {a..z} ::: {a..z} ::: {0..9} ::: {0..9} ::: {0..9} ::: {0..9} > /tmp/a
希望这可以帮助!
-迈克
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句