bash substring古怪

时间:2012-07-19 06:26:26

标签: bash substring

以下是密码生成器的一个片段:

# ...
ascstring='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHILKLMNOPQRSTUVWXYZ!#$%&()*+-;   <=>?@^_`{|}~'
asclen=${#ascstring} # modulo ascstring
#...
r=$(openssl rand 100000 | sha1sum) # generates 40 hex sequence
#...
for i in {0..38..2}
do
    v=${r:i:2} ; echo -n ${ascstring:$[ 0x$v % $asclen]:1}
done
echo
# ...

它使用ascstring的各种定义,但显示的那个偶尔会导致问题。 大多数情况下没关系:

$ ./password-gen.sh 
`?OCw&a|746|SRm8b&c=

$ ./password-gen.sh 
eE?R%3NdUjSpd<)wPuBV

$ ./password-gen.sh 
0X8)p8hPobt$x@iGy?!I

$ ./password-gen.sh 
P7LD;p<^lX1d87;{V4S$

但偶尔:

$ ./password-gen.sh 
5w@$ypassword-gen.sh@)A|l`06B(50f7

如果我从*移除ascstring,这似乎永远不会发生。 我想知道发生了什么以及如何解决这个问题(不减少熵)?

感谢。

1 个答案:

答案 0 :(得分:5)

你应该引用字符串echo:

...
echo -n "${ascstring:$[ 0x$v % $asclen]:1}"