주어진 텍스트와 키를 사용하여 비지네레 암호를 수행하는 쉘 스크립트를 작성하려고 하는데 변환된 문자의 새 ASCII 번호를 변수에 저장하는 방법을 알 수 없습니다. 코드는 아래와 같이 표시됩니다.
function encode {
local message=$1
local key=$2
local encoded=""
for ((i=0; i<${#message}; i++)); do
local m=`echo $message | cut -c $((i+1))`
local k=`echo $key | cut -c $((i%${#key}+1))`
local m_ascii=`printf "%d" "'$m"`
local k_ascii=`printf "%d" "'$k"`
local e_ascii=$(((m_ascii + k_ascii - 2*97) % 26 + 97))
local e=echo "&e_ascii" | awk '{ printf("%c",$0); }'
encoded="$encoded$e"
done
echo $encoded
}
해당 디코딩 기능에서도 동일한 문제가 발생했습니다.
답변1
일련의 변수를 사용하여 쉘 명령을 실행하는 방법 awk
:
message="foobar"
cmd="echo \047"message"\047 | cut -c 3"
if ( (cmd | getline m) > 0 ) { print m }
else { print "Failed ..." | "cat>&2"; exit 1}
close(cmd)
Ed Morton에게 감사드립니다. 첫 번째 시도는 다음과 같습니다.
message="foobar"
"echo "message" | cut -c 3" | getline m
print m
답변2
다음 echo "&e_ascii"
으로 변경한 echo "$e_ascii"
다음 코드를 복사/붙여넣기하세요.e=echo ...
e=$(echo ...)
http://shellcheck.net남은 문제를 해결하는 방법을 알려줄 수 있기를 바랍니다.
그러나 쉘을 사용하여 텍스트를 조작하는 대신 awk와 같은 텍스트 처리 도구를 사용하십시오. GNU awk를 ordchr
라이브러리로 사용하여 스크립트를 한 줄씩 구현하려고 하므로 일부가 잘못되었거나 더 나은 방법이 있을 수 있으며 입력 예제를 제공하지 않았기 때문에 테스트되지 않았습니다. /산출:
encode() {
awk -v message="$1" -v key="$2" '
@load "ordchr"
BEGIN {
msgLgth = length(message)
keyLgth = length(key)
for ( i=0; i<msgLgth; i++ ) {
m = substr(message,i+1,1)
k = substr(key,(i % keyLgth) + 1,1)
m_ascii = ord(m)
k_ascii = ord(k)
e_ascii = (m_ascii + k_ascii - 2*97) % 26 + 97
e = chr(e_ascii)
encoded = encoded e
}
print encoded
}
'
}
GNU awk가 없으면 다음을 참조하세요.https://www.gnu.org/software/gawk/manual/html_node/Ordinal-Functions.html글쓰기 방식 ord()
과 chr()
기능성.