샘플 파일
오렌지 주스
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"