awk出力を変数に保存するのに役立ちます

awk出力を変数に保存するのに役立ちます

指定されたテキストとキーを使用してビジネスパスワードを実行するシェルスクリプトを作成しようとしていますが、変換された文字の新しい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ライブラリとして使用してスクリプトを1行ずつ実装しようとしているため、一部が間違っているか、より良い方法がある可能性があり、入力例を提供していないためテストされていません。 /出力:

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()機能性。

関連情報