私はこの状況を持っています:
./
./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
内の引数の数は事前にわかりません。ゼロ以上の場合があります。
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[@]}"
これは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}'
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