2011-07-29 2 views
9

cat 명령에서 나오는 각 행에 대해 명령을 실행하려고합니다. 나는 이것을 벤더로부터받은 샘플 코드에 기초하고있다.bash 스크립트 루프의 cat 명령문 출력

다음은 스크립트의 :

for tbl in 'cat /tmp/tables' 
do 
    echo $tbl 
done 

그래서 내가 출력이 파일의 각 줄 것으로 기대했다. 대신 나는 이것을 얻고있다 :

cat 
/tmp/tables 

분명히 내가 원한 것이 아니다.

나는 데이터베이스와 인터페이스하는 실제 명령으로 echo를 대체 할 것입니다.

이 문제를 해결하려면 도움이 필요합니다.

답변

14

잘못된 유형의 인용 부호를 사용하고 있습니다.

인수를 실행중인 프로그램으로 만들고 내용을 for 루프로 파이프 아웃하려면 작은 따옴표가 아닌 역 인용 부호를 사용해야합니다. 더 나은 가독성 또한

for tbl in `cat /tmp/tables` 
do 
    echo "$tbl" 
done 

(당신이 떠들썩한 파티를 사용하는 경우) 여러분의 기대에 각 줄을 (얻을 경우, 당신은

for tbl in $(cat /tmp/tables) 
do 
    echo "$tbl" 
done 

로 쓸 수있는 루프에 대한-위의 당신에게 각 단어를 줄 것이다), 당신은이

cat /tmp/tables | xargs -L1 echo 

처럼 또는 루프

로, xargs를 사용하여 더 나을 수 있습니다개
+1

를 들어, IFS (입력 필드의 separator)를 재정 의하여 bash는 구문 분석을 많이 할 수 있습니다. 감사. – geoffrobinson

2

단일 따옴표해야한다 역 따옴표 :

for tbl in `cat /etc/tables` 

이 라인으로 사용하면 출력/입력을받지 않습니다,하지만

하지만, 말씀으로. 동안 루프

cat /etc/tables | while read line 
    echo $line 
done 
3

: 라인으로 라인을 처리하려면, 당신은 같은 것을 시도해야

while read line 
do 
echo "$line" 
done < "file" 
2
while IFS= read -r tbl; do echo "$tbl" ; done < /etc/tables 

this를 참조하십시오.

0

당신은 내가 이런 바보 같은 알았 예를

IFS='\t\n' 
for tbl in `cat /tmp/tables` 
do 
    echo "$tbl" 
done 
+0

'\ t \ n'? 실제로 bash에서 해봤습니까? 그것은 '\', 't', 'n'에 도움이되지 않을 것입니다. – kubanczyk