Shell 스 크 립 트 가 텍스트 파일 을 한 줄 씩 읽 습 니 다(텍스트 형식 을 바 꾸 지 않 음)

인터넷 에는 셸 script 이 텍스트 파일 을 읽 는 예 가 많 지만 이야기 의 전 부 를 말 하지 못 하고 반 만 말 했다.예 를 들 어 testfile 파일 에서 다음 형식의 텍스트 줄 을 읽 습 니 다.

$ vi testfile
ls      -a -l /bin |  sort
ls      -a -l /bin |  sort | wc
ls      -a -l |  grep sh | wc
ls      -a -l
ls      -a -l |       sort      |    wc
가장 흔히 볼 수 있 는 line by line 에서 파일 내용 을 읽 는 예 는:

$ vi readfile
#!/bin/sh

testfile=$1
while read -r line
do
    echo $line
done < $testfile

$ chmod +x readfile
$ ./readfile testfile
ls -a -l /bin | sort
ls -a -l /bin | sort | wc
ls -a -l | grep sh | wc
ls -a -l
ls -a -l | sort | wc

이 예 의 문 제 는 텍스트 줄 을 읽 은 후에 텍스트 형식 이 바 뀌 었 고 원래 testfile 파일 의 내용 과 완전히 일치 하지 않 아 빈 칸 문자 가 자동 으로 삭제 되 었 습 니 다.왜 이러 지?IFS 는 셸 script 에 IFS 가 명확 하 게 지정 되 어 있 지 않 으 면 기본적으로 빈 칸,탭,줄 바 꾸 기 등 을 나 누 기 때문에 위 텍스트 줄 에 남아 있 는 빈 칸 과 줄 바 꾸 기 가 자동 으로 들 어 갑 니 다.
testfile 파일 의 원래 형식 을 출력 하려 면 줄 마다(전체 로)그대로 인쇄 하면 어떻게 합 니까?이 때 IFS 변 수 를 지정 하여 셸 에 게'줄'단위 로 읽 으 라 고 알려 야 합 니 다.

$ vi readfile
#!/bin/sh

IFS=""

testfile=$1
while read -r line
do
    echo $line
done < $testfile

$ ./readfile testfile
ls      -a -l /bin |  sort
ls      -a -l /bin |  sort | wc
ls      -a -l |  grep sh | wc
ls      -a -l
ls      -a -l |       sort      |    wc    

위의 두 가지 방법의 수출 은 차이 가 많 지 않 습 니까?무슨 관계 가 있 습 니까?첫 번 째 는 좀 아름 답지 않 습 니까?관계 가 중대 합 니 다.VPSee 는 어제 셸 을 모 의 하 는 C 프로그램 을 쓴 다음 에 셸 script 을 써 서 이 C 프로그램 을 테스트 했 습 니 다.이 script 은 위의 testfile 에서 전체 줄 을 읽 어서 C 프로그램 에 전달 해 야 합 니 다.위의 두 가지 방법 에 따라 두 가지 다른 입력 형식 을 얻 을 수 있 고 의미 가 완전히 다 릅 니 다.

$./mypipe ls -a -l | sort | wc
$./mypipe "ls -a -l | sort | wc "
분명히 내 가 원 하 는 것 은 두 번 째 입력 이다.'ls-a-l|sort|wc'를 전체적으로 나 에 게 전 달 된 my pipe 로 서 나의 my pipe 가 문자열 안의 각종 명령 을 정확하게 식별 할 수 있 는 지 테스트 하 는 것 이다.
IFS 를 사용 하지 않 으 면 위의 두 번 째 방법의 효 과 를 얻 을 수 있 는 방법 이 있 습 니 다.

#!/bin/sh

testfile=$1
x=`wc -l $testfile |awk '{print $1}'`

i=1
while [ $i -le $x ]
do
    echo "`head -$i  $testfile | tail -1`"
    i=`expr $i + 1`
done

좋은 웹페이지 즐겨찾기