Bourne Shell do while 루프는 모든 데이터를 반환하지만 해당 파일이나 디렉토리가 없고 쉘 이름을 반복하는 두 가지 오류가 있습니다.

Bourne Shell do while 루프는 모든 데이터를 반환하지만 해당 파일이나 디렉토리가 없고 쉘 이름을 반복하는 두 가지 오류가 있습니다.

내 루프의 아이디어는 파일의 모든 줄의 첫 번째 숫자를 인쇄하는 것입니다. 파일은 다음과 같습니다.

256-56-8411     Bob     3.61    Junior          CS
471-44-7458     Tim     3.45    Senior          CE
326-56-4286     Rajesh  2.97    Freshman        TE
548-66-1124     Eric    2.88    Sophomore       EE
447-21-3599     John    2.51    Junior          CS
911-41-1256     Rebecca 3.92    Senior          CS
854-22-6372     Robin   2.45    Freshman        TE

스크립트를 실행한 후의 출력은 다음과 같습니다.

    This is a script that analyses student data from input file students.txt
----------------------------------------------------------------------
./student_script: line 8: 2
4
3
5
4
9
8: No such file or directory
7 is the number of students in the input file.

마지막으로 코드는 다음과 같습니다.

echo "This is a script that analyses student data from input file $1"
echo "----------------------------------------------------------------------"
studentCount=`wc -l < $1 `
tempFile=`cut -c1 $1`
while read n
do
echo "$n"
done < $tempFile

echo "$studentCount is the number of students in the input file."

이 문제를 해결한 후에는 while 루프를 사용하여 첫 번째 숫자가 4인지 아닌지 확인한 다음 4로 시작하지 않는 ID(첫 번째 열) 수를 명시할 계획입니다.

나는 내 접근 방식보다 더 깨끗한 솔루션에 대해 배우는 것을 꺼리지 않습니다. 그러나 이것은 수업을 위한 것이고 우리가 많은 것을 배웠다고 생각하지 않습니다. 여행 중에 awk와 유사한 내용을 많이 보았지만 아직 awk를 전혀 배우지 않았습니다.

하지만 네, 기본적으로 두 개의 추가 비트를 추가한 것을 제외하고는 루프에서 원하는 모든 데이터를 얻었습니다.

답변1

이 줄에 쓴 내용은 다음과 같습니다.

tempFile=`cut -c1 $1`

라는 파일을 생성하지 않습니다 tempFile. 따라서 그 내용을 읽을 수 없습니다.

해당 줄을 다음과 같이 변경할 수 있습니다.

cut -c1 "$1" > tempFile

그리고 루프가 읽을 수 있도록 라는 파일이 tempFile생성됩니다 . 변수가 null(존재하지 않음) 이므로 해당 루프에서는 while read사용하지 마십시오 . ($ 없음)과 같은 것을 사용하십시오.$tempFile$tempfile

done < tempFile

그러나 간단한 명령은 cut -c1 "$1"소스 파일의 첫 번째 문자를 모두 작성하므로 다음을 실행하여 확인하십시오.

cut -c1 "sourcefile"

이를 알고 있으면 값을 보유하기 위해 tempFile이 필요하지 않으며 here 문서를 사용하십시오.

here 문서를 사용하고 스크립트의 다른 문제를 정리하십시오.

#!/bin/sh
echo "This is a script that analyses student data from input file $1"
echo "----------------------------------------------------------------------"
studentCount="$(wc -l < "$1" )"

while read n
do
    echo "$n"
done <<-_avoid_a_file_
$(cut -c1 "$1")
_avoid_a_file_

echo "$studentCount is the number of students in the input file."

어떤 인터프리터가 코드를 실행해야 하는지 나타내기 위해 she-bang(#!)을 사용하는 것이 좋습니다. 이 경우에는 sh에 대한 언급 때문에 당신이 원한다고 가정했습니다 Bourne shell. 원래 Bourne 쉘은 꽤 오래되었으며(~1979) 최신 쉘(ksh, bash, mksh, zsh 등)에 많은 개선 사항이 추가되었습니다.

관련 정보