web-dev-qa-db-ja.com

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

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

./
./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内の引数の数は事前にわかりません。ゼロ以上の場合があります。

10
Federico Ponzi

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

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

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

より低いバージョンのbash

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

これは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}'
2
Rhim

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
1
Carl Lindgren