bash substring古怪

Tho*_*sen 3 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
# ...
Run Code Online (Sandbox Code Playgroud)

它使用了各种定义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$
Run Code Online (Sandbox Code Playgroud)

但偶尔:

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

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

谢谢.

Xiè*_*léi 5

你应该引用字符串echo:

...
echo -n "${ascstring:$[ 0x$v % $asclen]:1}"
Run Code Online (Sandbox Code Playgroud)