我正在开发一个非常基本的ROT-5(纯文本(转换器,作为学习Bash和涉猎密码学和逻辑的一种方式。
我通过获取文件的内容并将字母向前移动5个位置来实现它,如下所示:
#!/bin/bash
echo $(<$1)
echo $(<$1) | tr 'A-Za-z' 'F-ZA-Ef-za-e'
例如,如果我输入以下命令:
#./rot5.sh filename.txt
它会很好地转换它。有没有任何方法可以让它工作,这样如果我要输入以下内容:
./rot5.sh encodemysecretmessage
它会将tr
应用于encodemysecretmessage
,而不是查找文件名?
我建议显式并使用命令行标志,例如-s
:
$ ./rot5.sh test.txt
foobar
kttgfw
$ ./rot5.sh -s "my secret message"
my secret message
rd xjhwjy rjxxflj
下面是一个示例实现:
case $1 in
-s)
# Handle data as a string.
printf '%sn' "$2"
;;
*)
# Otherwise, handle data as a filename.
cat -- "$1"
;;
esac | tee >(tr 'A-Za-z' 'F-ZA-Ef-za-e')
(最后一行的工作原理是tee
接受它的输入并打印它,同时将它转发到一个文件。这里我用进程替换来替换文件。(
注意:这只是一个简单的演示。对于比这更复杂的事情,很好地处理命令行标志实际上非常困难,所以我可能会使用getopts
,这需要一些样板。这是一个很好的来源的教程,尽管我自己还没有读过。
这是在@Robert的帮助下的工作解决方案:非常感谢:(
#!/bin/bash
if [ -f "$1" ]; then
echo $(<$1)
echo $(<$1) | tr 'A-Za-z' 'F-ZA-Ef-za-e'
else
echo "$1"
echo "$1" | tr 'A-Za-z' 'F-ZA-Ef-za-e'
fi