12

cat コマンドからの各行に対してコマンドを実行しようとしています。これは、ベンダーから入手したサンプル コードに基づいています。

スクリプトは次のとおりです。

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

したがって、出力がファイルの各行になると予想していました。代わりに私はこれを得ています:

cat
/tmp/tables

それは明らかに私が望んでいたことではありません。

エコーを、データベースとやり取りする実際のコマンドに置き換えます。

これを正すための助けをいただければ幸いです。

4

5 に答える 5

25

間違ったタイプの引用符を使用しています。

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

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

また、読みやすくするために (bash を使用している場合)、次のように記述できます。

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

各行を取得することが期待される場合 (上記の for ループは各単語を取得します)、次xargsのようにを使用する方がよい場合があります。

cat /tmp/tables | xargs -L1 echo

またはループとして

cat /tmp/tables | while read line; do echo "$line"; done
于 2011-07-29T03:40:02.940 に答える
4

一重引用符はバッククォートにする必要があります。

for tbl in `cat /etc/tables`

ただし、これは出力/入力を行単位ではなく、単語単位で取得します。行ごとに処理するには、次のようなものを試してください。

cat /etc/tables | while read line
    echo $line
done
于 2011-07-29T03:41:57.520 に答える
3

whileループあり:

while read line
do
echo "$line"
done < "file"
于 2011-07-29T03:52:19.223 に答える
2
while IFS= read -r tbl; do echo "$tbl" ; done < /etc/tables

これを読んでください。

于 2011-07-29T04:01:18.140 に答える
0

たとえば、IFS(入力フィールドセパレータ)を再定義することにより、bashで多くの解析を行うことができます

IFS="\t\n"  # You must use double quotes for escape sequences. 
for tbl in `cat /tmp/tables` 
do 
    echo "$tbl"
done
于 2012-03-20T02:36:38.603 に答える