私は実行するたびに緯度と経度、そして出力ファイルの名前を尋ねるプログラムをFortranで書いた。良い結果。私がやろうとしていたのは、このプログラムを地球全体で実行することでした(つまり、合計65,341の異なる可能な組み合わせ)。シェルスクリプトでこれを行う際に問題があります。誰でも私にアドバイスを与えることができますか?これまで入力ファイルに触れましたが、プログラムは入力ファイルの最初の3つの項目(緯度、経度、ファイル名)を読み取って停止します。次のようなソーススクリプトを書くことができればいいと思います。
$ ./myprogram < lat1, lon1, filename1
$ ./myprogram < lat2, lon2, filename2
ただし、この記号は<
入力ファイルにのみ入力されます。入力する同様の方法がありますか?価値入力ファイルの代わりに?
答え1
バッシュサポートここにファイルそしてここに文字列があります文字列内のプログラムに標準入力を提供します。次のように:
./myprogram <<EOT
$lat1
$lon1
$filename1
EOT
myprogram
3行の入力、つまり、および変数値が提供されます。各変数を適切に設定するループにこれを置くと、毎回異なる標準入力を使用して複数回実行されます。lat1
lon1
filename1
myprogram
<<EOT
この文書を表示してください:これは、誰かが " "と言うまで、次の行を読み、EOT
それをプログラムに標準入力として提供することを意味します(<
ファイルでやっているように)。EOT
値が両方の位置に等しい場合は、必要なものを代わりに使用できます。
ここで文字列を使用することもできます。
./myprogram <<<"$lat
$lon
$filename"
これは同じことを行いますが、代わりに複数行の文字列リテラルを使用します。<<<"..."
上記のように与えられた文字列を取得し、標準入力に渡します。しかし、私はheredocのバージョンを好む。
POSIXでも動作する別のアプローチは、sh
適切なファイルを作成することです。
echo $lat > file
echo $lon >> file
echo $filename >> file
./myprogram < file
しかし、ここにある文書が利用可能であれば、より良いでしょう。 「bash」タグが付いているので使えると思います。
\n
エスケープ文字を使用するオプションもあります。echo
またはprintf
:
printf '%s\n%s\n%s\n' "$lat" "$lon" "$filename" | ./myprogram
echo -e "$lat\n$lon\n$filename" | ./myprogram
-e
echo
Bashや他のシェルでサポートされている共通の拡張です。printf
すべてのPOSIX互換システムで動作する必要があります。
答え2
プログラムに複数行の入力を提供する簡単で移植可能な方法は次のとおりです。
{
echo 'lat1'
echo 'lon1'
echo 'filename1'
} | ./myprogram
別の方法はここのドキュメント。