使Bash脚本接受在命令行中输入的文件名或文本行



我正在开发一个非常基本的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

相关内容

最新更新