2011-07-29 9 views
9

catコマンドからの各行に対してコマンドを実行しようとしています。私はベンダーから得たサンプルコードに基づいています。ここでbashスクリプトループのcat文の出力を出力します

はスクリプトです:

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

だから私は、出力がファイルの各行であることを期待していました。代わりに、私はこれを得ています:

cat 
/tmp/tables 

これは明らかに私が欲しかったものではありません。

私は、エコーをデータベースとのインターフェイスをとる実際のコマンドに置き換えます。

これを修正するための助けがあれば幸いです。

答えて

14

引用符のタイプが間違っています。

引数を実行中のプログラムにして、コンテンツをforloopにパイプして出力するには、一重引用符ではなく逆引用符を使用する必要があります。

読みやすくするためにも
for tbl in `cat /tmp/tables` 
do 
    echo "$tbl" 
done 

(もしbashを使用している場合)あなたの期待は、各ライン(forループ上記はあなたに各単語を与える取得している場合は、

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

としてそれを書くことができます)、あなたはこの

cat /tmp/tables | xargs -L1 echo 

またはループ

などのような、 xargsを使用したほうが良いかもしれ
+1

のために、私はそれがこのような愚かな何かを知っていた、IFS(入力フィールドセパレーター)を再定義することにより、bashでの解析の多くを行うことができます。ありがとう。 – geoffrobinson

2

単一引用符はバッククォートする必要があります:

for tbl in `cat /etc/tables` 

が、これはラインであなたの出力/入力を得るが、言葉によってません。 whileループで

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

関連する問題