Whileループはすべての値を繰り返すわけではありません。

Whileループはすべての値を繰り返すわけではありません。

私はPythonとCで何度も実行する必要があるいくつかのコードを作成しました。各コードは新しい入力値のセットを使用して実行されます。そのために、さまざまな入力量に対してさまざまなプログラムを実行するUnixシェルスクリプトを作成しました。

#!/bin/sh
_file="${1:-/dev/null}"

while IFS=' ' read -r f1 f2 f3 f4  
do
    cd folder1
    cd folder2
    echo "$f1 $f2 $f3 $f4 " > inputs.txt
    mpiexec -n 4 a_C_code
    cd ..
    cd ..
    python3 python_code_1.py
    python python_code_2.py
    python python_code_3.py
    python python_code_4.py
    echo "$f1" #So I know how many times the loops has been performed

done < "$_file"

スクリプトで読み込むファイルの形式は次のとおりです。

1 2 3 4
5 6 7 8
...

ただし、プログラムを実行すると、最初の入力セット(この場合は1 2 3 4)のみが繰り返され、他のさまざまな入力グループに対してプログラムを実行せずに完了します。

ベストアンサー1

シェルコードは大丈夫に見え、単純化されたテキストバージョンは期待どおりに機能します。

seq 12 | paste - - - - | 
while IFS=' ' read -r f1 f2 f3 f4 ; do 
    echo "$f1 $f2 $f3 $f4 " 
done

出力:

1   2   3   4    
5   6   7   8    
9   10  11  12   

だからスチールドライバーのコメントこれは真であり、プログラムまたはmpiexecプログラムのいずれかがpython残りの入力行を消費するため、echo 2番目の入力行に到達できません。

たとえば、空腹のコマンドセットが追加された上記のコードを考えてみましょう。

seq 12 | paste - - - - | 
while IFS=' ' read -r f1 f2 f3 f4 ; do 
     echo "$f1 $f2 $f3 $f4 "
     (read x; read x; read x;) 
done

出力(欠落行を参照):

1   2   3   4   

おすすめ記事