web-dev-qa-db-ja.com

bashスクリプトループでcatステートメントの出力を出力します

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

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

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

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

cat
/tmp/tables

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

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

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

10
geoffrobinson

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

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

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
19
Soren

whileループの場合:

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

読む this

2
grok12

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

for tbl in `cat /etc/tables`

ただし、これでは、行ごとではなく、Wordごとに出力/入力が行われます。行ごとに処理するには、次のようなことを試してください。

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

たとえば、IFS(Input Field Seperator)を再定義することで、bashで多くの解析を行うことができます。

IFS="\t\n"  # You must use double quotes for escape sequences. 
for tbl in `cat /tmp/tables` 
do 
    echo "$tbl"
done
0
bertramlau