Linux tr命令未按预期工作

Linux tr命令未按预期工作,linux,bash,ubuntu,random,passwords,Linux,Bash,Ubuntu,Random,Passwords,我有这个密码生成器: pass () { # Generates a random password local size="${1:-12}" local alphabet="$2" </dev/urandom tr -dc "$alphabet" | head -c$size ; echo "" } 但失败如下: » pass 20 '[:alnum:]' DpEf8bMp7zfkvSoudItS » pass 20 '[:alnum:]@#%+-/

我有这个密码生成器:

pass () {
    # Generates a random password
    local size="${1:-12}"
    local alphabet="$2"
    </dev/urandom tr -dc "$alphabet" | head -c$size ; echo ""
}
但失败如下:

» pass 20 '[:alnum:]'
DpEf8bMp7zfkvSoudItS
» pass 20 '[:alnum:]@#%+-/~'
JSNweE,.EU+P.l5nqkzd
tr
命令明确表示:

删除不属于给定集合的所有字符

因此,字符
是意外的


它们来自哪里?

还有另一部分您忽略了的
tr
手册页:

CHAR1-CHAR2

按升序排列从CHAR1到CHAR2的所有字符

因此部分
+-/
将表示字符
+
-
/
。(
manascii
在这里很有用)

对于连字符,可以将其转义:

pass 20 '[:alnum:]@#%+\-/~'
改用
\055

pass 20 '[:alnum:]@#%+\055/~'
或者把它放在最后:

pass 20 '[:alnum:]@#%+/~-'

Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参见帮助中心中的。也许或者会是一个更好的问的地方。@jww我们以前有过这个。这个问题是关于shell编码的。这是正题。您真的应该一次又一次地阅读链接后面的页面。@jww Bash tag:有关为Bash命令shell编写的脚本的问题。--关于Bash交互使用的问题更可能是关于超级用户的话题,而不是关于堆栈溢出的话题。。这个问题肯定是关于一个脚本,而不是关于交互使用。在否决投票时,通常也会发表评论。这是指对答案的否决票。@JamesBrown:我肯定这是由jww出于上述原因所做的,他声称自己通常是离题废话!抢手货