Shell 脚本:\n 分割直接行的相关问题

Shell 脚本:\n 分割直接行的相关问题

这是一个 shell 脚本片段:

KVS_VARIABLES=$(awk -F= '!($1 && $2 && NF==2) { print "File failed validation on line " NR | "cat 1>&2"; next } { print $1, $2 }' $ENV_FILE_LOCATION)
echo ${KVS_VARIABLES}

for kv in ${KVS_VARIABLES}
do
  echo $kv
  key=$(echo $kv | awk -FS=" " '{print $1}')
  value=$(echo $kv | awk -FS=" " '{print $2}')

  echo "key: $key | value: $value"
done

我期望的输出如下:

key: VAR1 | value: VAL1
...

但是,我得到的是:

VAR1 VAL1 VAR2 VAL2 VAR3 VAL3
VAR1
key: VAR1 | value: 
VAL1
key: VAL1 | value: 
VAR2
key: VAR2 | value: 
VAL2
key: VAL2 | value: 
VAR3
key: VAR3 | value: 
VAL3
key: VAL3 | value:

编辑

$ echo "$KVS_VARIABLES" ->
VAR1 VAL1
VAR2 VAL2
VAR3 VAL3

答案1

您需要指定IFSas newline,默认情况下输入文件分隔符(IFS)包含空格,因此您的 for 循环的行为方式如下

KVS_VARIABLES=$(awk -F= '!($1 && $2 && NF==2) { print "File failed validation on line " NR | "cat 1>&2"; next } { print $1, $2 }' $ENV_FILE_LOCATION)
echo ${KVS_VARIABLES}
IFS=$(echo -en "\n\b")
for kv in ${KVS_VARIABLES}
do
  echo $kv
  key=$(echo $kv | awk  '{print $1}')
  value=$(echo $kv | awk  '{print $2}')    
  echo "key: $key | value: $value"
done

答案2

尝试:

#!/bin/bash

KVS_VARIABLES=$(echo -e "VAR1 VAL1\nVAR2 VAL2\nVAR3 VAL3\n")
echo "KVS_VARIABLES=[${KVS_VARIABLES}]"

while read -r kv; do
        echo "kv = ${kv}"
        key=$(echo $kv | awk '{print $1}')
        value=$(echo $kv | awk '{print $2}')

        echo "key: ${key} | value: ${value}"
done <<< "${KVS_VARIABLES}"

你应该得到

KVS_VARIABLES=[VAR1 VAL1
VAR2 VAL2
VAR3 VAL3]
kv = VAR1 VAL1
key: VAR1 | value: VAL1
kv = VAR2 VAL2
key: VAR2 | value: VAL2
kv = VAR3 VAL3
key: VAR3 | value: VAL3

答案3

作为阿鲁希克斯指出,代码的问题之一是将read输入拆分为 shell 变量中的值IFS(默认情况下为空格、制表符和换行符)。

但是,我不禁注意到您多次解析原始文件中的变量;首先使用第一个awk脚本,然后再次使用read,最后第三次使用echo+ awk。每个步骤都可能引发自己的一组错误。

如果您只想验证变量分配并打印出键/值对:

if ! awk -F '=' 'NF != 2 { exit 1 } { printf("key: %s | value: %s\n", $1, $2) }' "$conffile"; then
    echo 'Failed' >&2
    exit 1
fi

给定输入文件

VAR1=VAL1
VAR2=VAL2
VAR3=VAL3
VAR4=VAL4

这将打印

key: VAR1 | value: VAL1
key: VAR2 | value: VAL2
key: VAR3 | value: VAL3
key: VAR4 | value: VAL4

BOO如果在输入文件末尾添加额外的一行,则输出将是

key: VAR1 | value: VAL1
key: VAR2 | value: VAL2
key: VAR3 | value: VAL3
key: VAR4 | value: VAL4
Failed

除了 之外NF == 2,您可能还需要检查有效的变量名称等:

if ! awk -F '=' 'NF != 2 || $1 !~ /^[A-Za-z][A-Za-z0-9]+$/ { exit 1 } { printf("key: %s | value: %s\n", $1, $2) }' "$conffile"; then
    echo 'Failed' >&2
    exit 1
fi

相关内容