次の形式の日付を含むファイル(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
.
Sourcing() が不要な場合は、仕事のように聞こえます。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