ファイルからbashスクリプトに引数を渡す


10

私はこの状況を持っています:

./
./myscript.sh
./arguments.txt
./test.sh

内部myscript.shでは、ファイルを実行test.shして、内部に含まれている引数をそれに渡さなければなりませんarguments.txt

myscript.shは次のとおりです。

arguments=$(cat arguments.txt)
source test.sh $arguments

これは、arguments.txtに最大で1つの引数が含まれている場合にうまく機能します。

firstargument 

置換は次のとおりです。

++ source test.sh 'firstargument'

しかし、問題は2つ以上の引数にあります。これを行います:

++ source test.sh 'firstargument secondargument'

また、内部の引数の数は事前にわかりませんarguments.txt。ゼロ以上の場合があります。


あなたが説明しているのは、bashのデフォルトの動作ではありません。あなたは本当にbashを使用していますか、それとも他のシェル(これを行うzshなど)を使用していますか?
Patrick 14

@パトリックこんにちは、本物のバッシュです。とにかく私はとにかくおかげで答えをすでに得ました!
フェデリコポンジ14

あなたは実際source test.sh "$arguments"に引用符で書いていますか?それはあなたの説明の1つの説明になるでしょう
グレンジャックマン'21

二重引用符ありとなしの両方を試しました。bashの置換を使用すると、常に単一引用符が取得されます。したがってsource test.sh "$arguments"source test.sh $arguments両方ともになりsource test.sh 'firstargument secondargument'ます。
Federico Ponzi 14

回答:


6

の各行arguments.txtが個別の引数を表すと仮定すると、bash 4では、(ファイルの各行が順番に配列要素としてarguments.txt挿入される)を使用して配列に読み取りmapfile、その配列をコマンドに渡すことができます。

mapfile -t <arguments.txt
source test.sh "${MAPFILE[@]}"

利点は、行内に埋め込まれたスペースでの分割が回避されることです

より低いバージョンのbash

IFS=$'\n' read -ra arr -d '' <arguments.txt
source test.sh "${arr[@]}"

arguments.txtファイル内では、引数はスペースで区切られています。ところで私は配列とforを使用して非常によく似たものを試しましたが、うまくいきませんでしたし、その理由もわかりません。まあ、どうもありがとう!
フェデリコポンジ14

2

これはで行えますawk。例えば:

arguments=`awk '{a = $1 " " a} END {print a}' arguments.txt`

コメントを読んだ後に編集します。

arguments=`awk '{i = 0; while(i<=NF){i++; a = a " "$i}} END {print a}'

1

while / doループを持つ関数を使用して引数ファイルを反復処理することをお勧めします。

関数を含むファイルを作成し、関数内のtest.shファイルを呼び出して、arguments.txtファイルに含まれる引数を反復処理するだけです。

#!/bin/sh
# Calling script

function_name ()
  {
    while read line;
      do
        . ~/path_to/test.sh $line
         do_something_commands # print to screen or file or do nothing
      done < ~/path_to_/argument_file.txt
  }

function_name # Call the function
  do_something_commands # print to screen or file or do nothing
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.