帮助将 awk 输出存储在变量中

帮助将 awk 输出存储在变量中

我正在尝试编写一个 shell 脚本,该脚本使用给定的文本和密钥执行 viginere 密码,但无法弄清楚如何在变量中保存转换后的字符的新 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

通过串联运行带变量的 shell 命令的方法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)

谢谢埃德·莫顿,我的第一次尝试是:

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我希望它会告诉您如何解决剩余的问题。

不过,不要使用 shell 来操作文本,而是使用 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()功能。

相关内容