2016-10-29 2 views
0

내 목표는 텍스트의 각 라인 내 텍스트 파일의 라인 수를 계산루프의 파일에서 행을 읽으려면 어떻게해야합니까?

먼저 파일 TTS하는 것입니다

#!/bin/bash 

LINES=$(cat /home/mytext.txt | wc -l) 

내가 루프를 정의하려면 :

let "n = $LINES" 
while [ $n -ne 0 ] 

TTS "the first line" 
sleep 5 

let "n--" 
done 
exit 

을 그러면 다음 줄이 존재하는 한 반복문이 반복되어 다음 줄을 읽습니다. 당신이 원하는 무엇

답변

2

read이다 :

cat /home/mytext.txt |\ 
while IFS='' read -r CUR_LINE || [ -n "$CUR_LINE" ]; do 
    do_something_with "$CUR_LINE" 
done 

그것은 것입니다 : 고양이 텍스트 파일을 더 이상 줄이 남아 있지 때까지 다음 라인을 읽고 각 라인에 뭔가. || [ -n "$CUR_LINE" ] 비트는 텍스트 파일이 공백 행으로 끝나지 않으면 while이 오류 상태 (0이 아닌 종료 코드)로 끝나지 않도록하는 것입니다. 스크립트를 set -e (오류 발생시 종료)으로 실행하면 문제가됩니다.

+2

Re : "set -e를 사용하여 스크립트를 실행하면 오류가 발생합니다.": Eh? 그건 전혀 관련이없고 내게 무관 한 것처럼 보입니다. '|| [-n "$ CUR_LINE"]'은 입력에 후행 줄 바꿈이 없으면 마지막 줄은 여전히 ​​처리됩니다. – ruakh

+2

++; 그러나''done '다음에 입력 리다이렉션 ('<')을 사용하여 파이프 라인을 사용하지 않고 입력을 제공하는 것이 더 나 낫습니다. 따라서 서브 쉘은'cat'을 사용하십시오. ('\'를 사용하여 명시 적으로 여기에 줄 연속 문자를 표시 할 수 있지만'|'다음에 필요하지 않음에 유의하십시오 - 현재 줄이 완전한 명령이 아닐 경우 Bash는 다음 구문을 계속 분석합니다 윤곽)). – mklement0

+0

@ruakh : 이유에 대해 좋은 점. 'set -e'는 여기에 실제로는 관계가 없지만 _unrelated_ : "'-e' 설정은'while','until','if' 또는'elif' 예약 다음에 복합리스트를 실행할 때 무시됩니다 단어,'! '예약어로 시작하는 파이프 라인, 또는 마지막 것과 다른 AND-OR리스트의 명령. " - [POSIX 사양] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_25_03). 다른 말로하면 :'set -e'는 명시 적으로 _conditionals_에서 실행 된 명령에는 적용되지 않습니다. – mklement0

관련 문제