【问题标题】:bash substring weirdnessbash子字符串怪异
【发布时间】:2012-07-18 07:07:04
【问题描述】:

这是密码生成器的片段:

# ...
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 中删除*,这似乎永远不会发生。 我想知道发生了什么以及如何解决这个问题(不减少熵)?

谢谢。

【问题讨论】:

  • 也许是个愚蠢的问题,但是如果不删除 * 而是将其移动到 ascstring 中的第一个位置(或最后一个位置)会发生什么?
  • 那是由于globbing,字符*被扩展为列出目录的内容。您可以禁用使用set -f,因此在设置ascstring 的值之前,一个选项可能是使用set -f
  • @ another.anon.coward 感谢您的澄清
  • $[..] 已弃用;请改用$((..))

标签: bash substring


【解决方案1】:

你应该引用字符串来回显:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 2017-11-04
    • 2021-11-03
    • 2011-10-30
    • 2012-08-09
    • 1970-01-01
    • 2013-08-12
    • 2017-01-13
    相关资源
    最近更新 更多