2013-10-27 2 views
1

질문 : 스크립트는 인수로 여러 개의 파일 이름을받습니다. 스크립트는 제공된 모든 인수가 파일인지 디렉토리인지 확인해야합니다. 디렉토리보고. 파일 인 경우 파일 이름과 파일에 포함 된 행 수를보고해야합니다.쉘 사용자 변수의 불일치

다음

내 코드는,

#!/bin/sh 
for i in $*; do 
    if [ -f $i ] ; then 
     c=`wc -l $i` 
     echo $i is a file and has $c line\(s\). 
    elif [ -d $i ] ; then 
    echo $i is a directory. 
    fi 
done 

출력 :

[email protected]:~/unixstuff/shells$ ./s317i file1 file2 s317h s317idir 
file1 is a file and has 1 file1 line(s). 
file2 is a file and has 2 file2 line(s). 
s317h is a file and has 14 s317h line(s). 

내 질문 : 변수 C의 값이 1 파일 1, 2 파일 2이며, 모든 반복에 14 s317h. 반면에 1,2와 14로 바꾸고 싶습니다. 왜 이전 값을 포함하고 후자 값을 포함하지 않습니까? 내가 어디서 잘못한거야?

참고 : s317i는 파일 ​​이름이고 file1은 파일 2입니다. s317h 및 s317idir은 명령 줄 인수입니다.

친절한 조언.

+2

"왜 이전 값을 포함하고 있습니까?"- 콘솔에'wc -l some_file'을 입력하면 그 이유를 알 수 있습니다. 나는 그것이 당신이 물어보고 싶은 질문이 아니라고 생각합니다. – Mat

+0

'c = \'cat $ i | wc -l \''을 시도해보십시오. 그러면 wc가 인쇄 할 파일 이름을 갖지 않게됩니다. –

답변

3

그게 wc 명령의 출력입니다. 예를 들면 : 당신이 file1 또는 파이프에서 stdin 리디렉션 경우

$ wc -l file1 
1 file1 

그러나 wc에 다른 명령의 stdout는 당신에게 파일 이름을 제공하지 않습니다. 다음과 같이

$ wc -l < file1 
1 
$ cat file1 | wc -l 
1 

따라서 스크립트 읽어야 : 나는 bash 대신 sh[email protected] 대신 $*을 사용하고

#!/bin/bash 

for arg in [email protected]; do 
    if [ -f $arg ]; then 
     echo $arg is a file and has `wc -l < $arg` lines. 
    elif [ -d $arg ]; then 
     echo $arg is not a file, it is a directory. 
    fi 
done 

참고.

+2

약간의 문제 : "테스트"외부 또는 포크 "["내부 KSH/Bash 명령어 대신 [두 개의 인용 부호로 변수를 보호해야합니다. 자세한 내용은 http://stackoverflow.com/a/19598570/2900196을 참조하십시오. –