这是一个 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