2016-02-26 58 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命令。