web-dev-qa-db-ja.com

Bashスクリプト:ファイルをループする

いくつかの行を含むファイルがあります:

/snapshot/200
/snapshot/201
/snapshot/202

今、私はwhile IFSループで各行を使用して、それらに対して特定のアクションを実行しようとしています。

while IFS=' ' read -r test || [ -n "${test}" ];
do
    if ssh root@$TARGET "[ ! -d $test ]"
    then
        echo "${test}"
    fi
done < $filelist

ここでの問題は、1つの結果しか得られず、ファイル全体をループしていないのですか?これらの名前のディレクトリはないため、ifステートメントは正しいはずです。

ただし、if部分全体を削除して、

echo "${test}"

ループは機能します。

1
Slimo

sshwhileループから標準入力ストリームを継承し、readによって読み取られる最初の行を除いて$filelistファイル全体を読み取ります。

sshがこれを実行しないようにするには、ssh -nまたはssh ... </dev/nullを使用します。

sshはこのように機能し、次のように、単純なリダイレクトまたはパイプを介してリモートシステムにデータを渡すことができます。

ssh remote 'cat >remotefile' <localfile

" パイプ、リダイレクト、およびリモート接続を使用したシェルコマンドの理解に役立つ必要があります "も参照してください。

4
Kusalananda