以下はシェルスクリプトの断片です:
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
〜のようにAlushixが指摘した。、コードの問題の1つは、read
入力をシェル変数の値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