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

tempFilewhile read그리고 루프가 읽을 수 있도록 이름이 지정된 파일이 생성됩니다 . $tempFile변수가 $tempfilenull(존재하지 않음) 이므로 해당 루프에서 사용 하지 마세요 . 다음과 같이 사용하세요($ 제외).

done < tempFile

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

cut -c1 "sourcefile"

이를 알고 있으면 값을 저장하기 위해 tempFile이 필요하지 않습니다. 여기 문서를 사용하면 됩니다.

여기 문서를 사용하여 스크립트의 다른 문제를 정리하세요.

#!/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 등)에 많은 개선 사항이 추가되었습니다.

관련 정보