2012-09-02 3 views
2

나는 유닉스 초보자이므로 용서 해주시기 바랍니다.파일 이름을 묻는 유닉스 쉘

내가 파일 이름과 출력에 해당 파일의 행 수를 사용자 유형을 요청할 수 있습니다 쉘 스크립트를 작성 싶어, 여기 내 코드입니다 : 그러나

echo "Pls enter your filename:" 
read filename 
result=wc -l $filename 

echo "Your file has $result lines" 

, 나는 그것이 이후 작업을 가져올 수 없습니다 식별자 "filename"에 대해 불평합니다. 전문가의 도움을받을 수 있습니까?

result=$(wc -l $filename) 

그렇지 않으면, 결과 = 화장실 -l $ 파일 이름이, 화장실을 할당합니다 bash는이 결과, 다음 단어를 해석 : 당신이 화장실 -l $ 파일 이름을 평가하려면

답변

4

적어도 bash에서 정상적으로 작동합니다. 글쎄, read 잘 작동합니다. 그러나 result에 할당 아마되어야합니다 : 해당 명령의 출력을 모두 선이 파일 이름을 계산하기 때문에,

result=$(wc -l $filename) 

을하지만, 당신은 단지 라인 카운트를 얻기 위해 그것을 조금 변경하는 식으로 뭔가를 할 수 있습니다 :

result=$(cat $filename | wc -l) 

나 :

result=$(wc -l <$filename) 

명령, 당신은 :

result=wc -l $filename 

은, 문자 그대로 wcresult를 설정 -l 명령을 실행하려고합니다. 예를 들어

, 다음과 같은 다섯 줄 스크립트 :

#!/bin/bash 
echo "Pls enter your filename:" 
read filename 
result=$(cat $filename | wc -l) 
echo "Your file has $result lines" 

실행하고 입력으로 이름을 부여 할 때, 다음과 같은 생산됩니다

Your file has 5 lines 

당신이 경우 이 아니고 bash을 사용하는 경우 사용중인 쉘을 지정해야합니다. 서로 다른 껍질은 일을하는 방법이 다릅니다. 여기

+2

그냥 번호를 인쇄 할 화장실을 얻으려면이'화장실은 -l <$의 filename'는 cat' –

+0

@glennjackman'보다 더 우아한 나타납니다 당신은 STDIN 리디렉션 필요가 없습니다 -'wc -l $ filename' 역시 트릭을합니다 :). – jmdeldin

+2

@jmdeldin의 문제는'wc -l infile'의 출력이'12345 infile'입니다 - 입력 파일 이름도 포함되어 있습니다. 그 번호를 원한다면'awk' (다른 프로세스)와 같은 것을 post-process하거나 stdin ('cat infile | wc ...', 다른 프로세스 또는' paxdiablo

1

, 당신은 t이 할 수있는 (-l)을 실행할 명령으로 사용하십시오.

1

당신이가는 :

echo "Pls enter your filename:" 
read filename 
result=`wc -l $filename | tr -s " " | cut -f2 -d' '` 

echo "Your file has $result lines" 
관련 문제