
次の形式で日付を含むファイル (dates.txt という名前) を反復処理したいと思います。
2009 08 03 08 09
2009 08 03 09 10
2009 08 03 10 11
2009 08 03 11 12
2009 08 03 12 13
2009 08 03 13 14
そして、各行の各フィールドを位置パラメータとして別のスクリプトに渡します。
つまり、他のスクリプトは、コマンド ラインに次のコードを入力すると実行されます。
$ . the_script 2009 08 03 08 09
私が試してみましたfor i in $(./dates.txt);do echo ${i};done
しかし、次のようになります:
./dates: line 1: 2009: command not found
./dates: line 2: 2009: command not found
./dates: line 3: 2009: command not found
./dates: line 4: 2009: command not found
./dates: line 5: 2009: command not found
./dates: line 6: 2009: command not found
このことから、各行で動作しているが、各フィールドで停止している可能性があることがわかります。
上記の理由から、読み取った行を位置パラメータとして他のスクリプトに渡す方法がまだわかりません。また、どこでそれを実行すればよいのかわかりませんか? 助けてください!
答え1
おそらく、このようなことを意味しているのでしょうか?
while read -d $'\n' i; do echo $i;done <./dates
while read -d $'\n' i; do . the_script $i;done <./dates
答え2
調達(.
)が必要ない場合、これはxargs
:
xargs -a dates.txt -rL1 the_script
xargs
入力行を読み取り、指定されたコマンドの引数として使用します。デフォルトの行区切り文字は改行です。- 他のコマンドからデータをパイプしたり、 を使用して入力ファイルを指定したりできます
-a
。 - スクリプトの呼び出しごとに正確に 1 行が使用されるため、
-r
(行が空の場合は実行しない) オプションと-L
(呼び出しごとに最大 N 行を使用する) オプションを指定します。
答え3
コマンドで を使用しcat
、スクリプトが同じディレクトリにない場合はファイル名への正しいパスを使用していることを確認してください。リストが同じ場合は をdates.txt
使用します$(cat ./dates.txt)
。ここでタイプミスを編集しました。.txt を含めてください。
次に例を示します。
という名前の日付のリストdates.txt
。
2009 08 03 08 09
2009 08 03 09 10
2009 08 03 10 11
2009 08 03 11 12
2009 08 03 12 13
2009 08 03 13 14
lstdates.sh
そのリスト内の惑星を反映するように名付けられたスクリプト。編集済み
これは、内部フィールドセパレータ(IFS)のサブシェルで実行されます。1サブシェルの外側では変更されない2。
#!/bin/bash
# Listing each date as an argument for `the_script`.
# Parenthesis runs in a subshell
(
# IFS line break
IFS=$'\012'
for dates in $(cat ./dates.txt)
do
echo $(./the_script $dates)
done
)
デフォルトでは、IFS は各空白をフィールドの終わりとして認識します。IFS=$'\012'
各新しい行をフィールドの終わりとして認識します。各行が のように二重引用符で囲まれている場合は"2009 08 03 08 09"
、デフォルトの IFS が機能します。
the_script
以下の内容のみが含まれます。
#!/bin/bash
echo $1