셸 스크립트:\n 직접 회선 분할 관련 문제 [닫기]

셸 스크립트:\n 직접 회선 분할 관련 문제 [닫기]

다음은 쉘 스크립트 조각입니다:

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

관련 정보