ファイルを繰り返し、行を位置引数として別のファイルに送信します。

ファイルを繰り返し、行を位置引数として別のファイルに送信します。

次の形式の日付を含むファイル(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

引用:高度なバッシュスクリプトガイド第11章ループと分岐

関連情報