13

dbs.txt という単純なファイルがあります。bash で for ループを使用して、そのファイルの行を画面に表示したいと考えています。

ファイルは次のようになります。

db1
db2
db3
db4

bashファイルはtest.shと呼ばれ、次のようになります

for i in 'cat dbs.txt'; do
echo $i
done
wait

次のように入力してファイルを実行すると:

bash test.sh

端末出力を取得します。

cat dbs.txt

期待の代わりに

db1
db2
db3
db4

次のbashファイルはうまく機能します:

cat dbs.txt | while read line
do
echo "$line"
done

最初のスクリプトが機能しないのはなぜですか?

4

4 に答える 4

17

readの代わりにシェル組み込みを使用できますcat。単一のファイルのみを処理し、それが巨大ではない場合、おそらく次の方法がほとんどのソリューションよりも簡単で移植性が高くなります。

#!/bin/sh

while read line
do
    printf "%s\n" "$line"
done < "$1"

受け入れるオプションがプラットフォームによって異なる可能性があるという意味でprintfより安全などこかで読んだことを覚えています。したがって、使用する習慣を構築することは価値があるかもしれません.echoechoprintf

ビルトインの説明についてはread、シェルのマニュアル ページを確認してください。

于 2012-11-09T13:18:32.410 に答える
10

次のように、サブシェルを実行して出力をキャプチャする必要があります。

for i in `cat dbs.txt`; do
echo $i
done
wait

単一引用符の代わりにバックティック ` に注意してください。

bash では、以下も使用できます$(command)

for i in $(cat dbs.txt); do
echo $i
done
wait
于 2012-11-08T21:40:02.963 に答える
5

コマンド置換シェル機能が必要です。これにはPOSIX式が必要です$()

他の人が言ったように、バックティックを使用しないでください。

バッククォート(`)は、古いスタイルのコマンド置換で使用されます。

foo=`command`

foo=$(command)

代わりに構文をお勧めします。$()内でのバックスラッシュの処理はそれほど驚くべきことではなく、$()はネストするのが簡単です。見る

Linus G Thielが言ったことにもかかわらず、、、、、、..で動作$()します。shashzshdashbash

于 2012-11-08T23:42:29.910 に答える
1

一重引用符ではなくバッククォートが必要です

`vs'

于 2012-11-08T21:40:40.543 に答える