다음은 쉘 스크립트 조각입니다:
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가 지적했습니다., 코드의 문제 중 하나는 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