파일에서 여러 변수를 읽는 방법

파일에서 여러 변수를 읽는 방법

샘플 파일

오렌지 주스

10 100

오렌지 주스 반 갤런.

이것이 내가 한 일이고 효과가 있었습니다.

while read -r simpleName itemName; do
        read currentQuantity maximumQuantity
        read description

        echo "Item Name: $itemName"
        echo "Simple Name: $simpleName"
        echo "Item Number: $itemNumber"
        echo "Qty: $currentQuantity/$maximumQuantity"
        echo "Description: $description"
    done < $FILE

참고: 이 전에 사용자에게 프로젝트 번호를 묻는 메시지가 표시되고 열려는 파일을 결정합니다.

while 루프는 파일을 올바르게 읽고 변수를 저장하며 원하는 출력을 제공합니다. 문제는 동일한 while 루프를 두 번 더 사용했는데 작동하지 않았다는 것입니다. 어떤 이유로 다른 두 경우에서는 simpleName과 itemName이 공백으로 표시되지만 나머지는 정상적으로 작동합니다.

다음은 작동하지 않는 예입니다.

#!/bin/bash

echo ""
read -p "Enter an item number: " itemNumber
echo ""

FILE="./data/${itemNumber}.item"
date=`date "+%Y-%m-%d %H:%M:%S"`

if test -f $FILE; then

    if test -f ./data/queries.log; then
        echo "DELETED: $date - $simpleName" >> ./data/queries.log
    else
        > ./data/queries.log
        echo "DELETED: $date - $simpleName" >> ./data/queries.log
    fi

    while read -r simpleName itemName; do
        read currentQuantity maximumQuantity
        read description
    done < $FILE

    rm $FILE

    echo "$simpleName was successfully deleted."
else
    echo "ERROR: item not found."
fi

여기서 출력 오류는 다음과 같습니다.

삭제되었습니다.

따라서 $simpleName은 어떤 이유로 비어 있습니다. 왜 그것이 첫 번째 인스턴스에서는 작동하지만 이것은 작동하지 않는지 이해하지 못합니다.

참고: 두 인스턴스 모두 별도의 스크립트 파일에 있습니다.

작업을 수행하는 더 쉬운 방법이 있다는 것을 알고 있지만 매우 기본적인 명령으로 제한되어 있으며 sed, awk, grep, find 등 아래에 보이는 것과 거의 같은 명령을 사용할 수 없습니다.

답변1

read변수에는 예상된 구분 기호가 표시되지 않아 오류 상태로 종료되는 경우에도 항상 값이 할당됩니다.

예를 들어

$ (var=abcdef; 
   echo "      var=\"$var\"";
   read var;
   echo "ret=$? var=\"$var\"") < /dev/null
      var="abcdef"
ret=1 var=""

루프에서 궁극적으로 불완전한 행을 처리하는 관용구도 참조하세요 while read.`읽는 동안 -r 라인 ||은(는) 무슨 뜻인가요? [[ -n $line ]]` 무슨 뜻인가요?

그래서 당신이 이것을 가지고 있을 때:

while read -r simpleName itemName; do
    read currentQuantity maximumQuantity
    read description
done < $FILE

세 줄의 입력은 먼저 모든 변수를 로드한 다음 계속해서 simpleName읽으 려고 시도하면서 itemName해당 변수를 삭제합니다 . 또는 물론 전체 파일을 읽을 수도 있습니다. 예를 들어 4줄의 입력으로 인해 모든 변수가 비어 있게 됩니다.

여기서 무엇을 하고 싶은지 잘 모르겠지만 아마도 다음과 같을 것입니다.

while    read -r simpleName itemName
      && read currentQuantity maximumQuantity
      && read description; do
    process one set of values ...
done < "$FILE"

관련 정보