Shell 脚本中随机切换大小写
Dave 总结了 shell 脚本 L33t 生成器
上次,我谈到了非正式地称为 l33t-speak 的内容,这是一系列字母和字母对替换,标志着黑客精英的行话(或黑客精英的某些子集,因为我非常确定真正的计算机安全专家不需要用数字替换元音来听起来很酷和时髦)。
不过,作为一个 shell 脚本问题,这是一个有趣的练习,因为将一组转换规则适配成一系列命令非常简单。 然而,我回避了其中的一部分,这就是我想通过本文探讨的内容:有点随机地更改大写和小写字母。
例如,这就是 “Linux Journal” 可能变成 “LiNUx jOurNAl” 的地方。 为什么? 嗯,因为它是一个需要解决的难题。 天哪,你问我这么愚蠢的问题!
逐字母分解一行首要且也许是最困难的任务是获取一行输入并将其逐字母分解,以便可以分析和随机音译每个字母。 在 Linux 中有很多方法可以完成此任务(当然),但我将使用内置的 Bash 子字符串变量引用序列。 它看起来像这样
${variable:index:length}
因此,例如,要仅获取变量 input
的第九个字符,我可以使用 ${input:9:1}
。 Bash 还有另一个方便的变量引用,它可以生成特定变量的值的长度:${#variable}
。 将两者放在一起,这就是基本的初始化和循环
input="$*"
length="${#input}"
while [ $charindex -lt $length ]
do
char="${input:$charindex:1}"
# conversion occurs here
newstring="${newstring}$char"
charindex=$(( $charindex + 1 ))
done
请记住,charindex
初始化为 0,并且 newstring 初始化为 "",因此您可以看到它是如何快速逐步遍历每个字符,并将其添加到 newstring
中。“此处发生转换” 不是很令人兴奋,但这是您需要的占位符。
上次我还展示了一种快速简便的方法来随机选择一个数字 1-10,因此您有时可以让某些事情发生,而有时则不发生。 在此命令中
doit=$(( $RANDOM % 10 )) # random virtual coin flip
假设大写字母只有 30% 的机会转换为小写,但小写字母有 50% 的机会变为大写。 你如何编写代码? 首先,让我们进行基本测试
if [ -z "$(echo "$char" | sed -E 's/[[:lower:]]//')" ]
then
# it's a lowercase character
elif [ -z "$(echo "$char" | sed -E 's/[[:upper:]]//')" ]
then
# it's uppercase
fi
这是一个经典的 shell 脚本技巧:要确定字符是否是某个类的成员,请将其替换为空,然后测试生成的字符串是否为空(-Z
测试)。
最后一点很容易。 生成随机数,然后如果它低于阈值,则音译 char
;否则,什么也不做。 因此
if [ -z "$(echo "$char" | sed -E 's/[[:lower:]]//')" ]
then
# lowercase. 50% chance we'll change it
if [ $doit -lt 5 ] ; then
char="$(echo $char | tr '[[:lower:]]' '[[:upper:]]')"
fi
elif [ -z "$(echo "$char" | sed -E 's/[[:upper:]]//')" ]
then
# uppercase. 30% chance we'll change it
if [ $doit -lt 3 ] ; then
char="$(echo $char | tr '[[:upper:]]' '[[:lower:]]')"
fi
fi
将它们放在一起,你就得到了这个科学怪人的脚本
$ sh changecase.sh Linux Journal is a great read.
LiNuX JoURNal is a GrEaT ReAd.
$ !!
LINuX journAl IS a gREat rEAd
$
现在你已经准备好写一些勒索信了,看来!