2016-02-26 71 views
1

我打算创建一个凯撒暗号,它接受一个参数,并转移基于该参数的代码,但我的代码弄乱与上壳和下壳。凯撒暗号代码不工作

所以,它的意思是这样的:

$ echo "I came, I saw, I conquered." | ./caesar.sh 
V pnzr, V fnj, V pbadhrerq. 

,但我得到:

V pnzr, V FnJ, V pBADHERrq. 

我的代码是:

#!/bin/sh 

if [ -z "[email protected]" ];then 
    rotation=13; 
else 
    rotation=$((@ % 16)); 
fi 

tr $(printf %${rotation}s | tr ' ' '.')\a-zA-Z a-zA-Z 

我该如何解决这个问题?

+0

如果有人经过多个参数,你就不可能得到你想要的结果。你应该在一个'tr'命令中旋转大写字母,而在另一个中旋转小写字母?或者你是否需要单独生成映射并将它们组合得更好?脚本末尾的分号都是不必要的;他们将是必要的一线。 –

+0

如果您尝试编码'我可以看到朔望AT MIDNIGHT'(与13默认偏移),你得到了很多更'Z's输出比你真的想(在下半年全部大写字母字母最终为'Z',这对于加密文本的可译性不利)。模16是否意味着模26? –

+0

这也是我有问题,16本来是26 – xXxXXXXX

回答

1

您在整个双字母旋转, 'A-ZA-Z',所以 'S' 映射到 'F':

abcdefghijklmnopqrstuvwxyzABCDEFGHIKLMNOPQRSTUVWXYZ 
        |------------^ 

你显然希望保留的情况下,所以我会建议您应用两个单独的映射:首先,将'az'映射到'n-za-m'(或其他任何适合您的输入参数的映射)。然后在第二遍中,映射大写'A-Z' - >'N-ZA-M'。

+0

所以这应该工作: #!/ bin/sh if [-z“$ @”];然后 rotation = 13; else rotation = $((@%26)); fi tr $(printf%$ {rotation} s | tr'''。')'AZ''A-ZA-Z' tr $(printf%$ {rotation} s | tr'''。') 'AZ' 'A-ZA-Z' – xXxXXXXX

+0

我chnaged我的代码 #Hello World程序中的Bash shell #!/ bin/sh的 IN =“这是更好地创造出比学习!创建是生活的本质。“ if [-z“$ @”];然后 rotation = 14; else rotation = $((@%26)); fi echo $ IN | tr $(printf%$ {rotation} s | tr'''。')'a-zA-Z'a-za-zA-ZA-Z' 它可以工作,但会改变周期。我该如何解决这个问题 – xXxXXXXX

+0

选择一个除了句点之外的角色?或者找出它映射到哪个字符,并使用另一个'tr'来自行映射它。 –

0

您的方案,它的工作原理的基本适应是:

rotation=$((${1:-13} % 26)) 
padding=$(printf "%${rotation}s" "" | tr ' ' '\001') 
tr "${padding}a-z" "a-za-z" | 
tr "${padding}A-Z" "A-ZA-Z" 

这使用parameter expansionarithmetic为确定旋转。

它使用您的基本机制来设置填充,但使用Control-A而不是.作为填充字符;您的文本中很少有Control-A。

实际旋转命令分别处理小写从大写。

与包含在文件script.sh脚本,我得到:

$ bash script.sh 
I came, I saw, I conquered 
Can you say SYZYGY after midnight? 
V pnzr, V fnj, V pbadhrerq 
Pna lbh fnl FLMLTL nsgre zvqavtug? 
$ bash script.sh 3 
I came, I saw, I conquered, and O, was it ever worthwhile! 
Can you say SYZYGY after midnight? ABC...XYZ abc...xyz 
L fdph, L vdz, L frqtxhuhg, dqg R, zdv lw hyhu zruwkzkloh! 
Fdq brx vdb VBCBJB diwhu plgqljkw? DEF...ABC def...abc 
$ 

管道意味着输入的第一行是没有线的一端穿过推到了第二tr命令。