web-dev-qa-db-ja.com

ファイルのコンテンツをbashの複数の引数として渡す方法

時間とともに更新されるデータ(mydata)を含むファイルがあります。ファイルは次のようになります。

1 2 3

このファイルを使用して、これを行います(基本的に、各数値を個別のパラメーターとして処理します)。

myscript.sh 1 2 3

データは静的ではなく、時間とともに更新されるため、次のコマンドを実行します。

myscript.sh "$(cat mydata)"

しかし、代わりに./myscript.sh:1行目1:1:コマンドが見つかりません

私は何をすべきか?

6
michelemarcon

"$(cat mydata)"は、ファイルの内容mydataから末尾の改行を差し引いた文字列に評価されます。必要なのは、ファイル内の空白で区切られた単語のリストです。したがって、一度は、二重引用符の外でコマンド置換を使用します。

myscript.sh $(cat mydata)

堅牢性を高めるには、グロビングをオフにします。これにより、mydataの列に\[*?のいずれかの文字が含まれている場合、ファイル名パターンとして解釈されません。 IFS を設定してWordの区切り文字を含めることもできますが、デフォルト(ASCIIの空白)が必要なものになっているはずです。

(set -f; myscript.sh $(cat mydata))

または、readビルトインを使用することもできます。これにより、最初の行が読み取られ、残りは無視されます(cathead -n 1で置き換えることにより、上記で実行できます)。

read -r one two three rest <mydata
myscript.sh "$one" "$two" "$three"

通常、これがxargsの目的です。

xargs myscript.sh < mydata

xargsは、入力を空白または改行で区切られた単語と見なします。区切り文字をエスケープするために、単一引用符、二重引用符、またはバックスラッシュが使用されます。 xargsは、コマンドに渡される引数(および環境)のサイズの制限を回避するために、必要な回数だけコマンドを実行します。

5

複数の引数として渡す代わりに、引数を単一の配列として渡して、引数に対して必要なことをすべて実行します。

#This is the function which takes a variable length array as an input. 
function function_call() 
{
    all_array_values=$1[@]
    a=("${!all_array_values}")
    for i in "${a[@]}" ; do
        echo "$i"
    done
}


#Here I add all the file contents to the variable named input.  
input=$(cat filename)
#In this step I convert the file contents to an array by splitting on space. 
input_to_array=(${input//' '/ })
#I call the function here. 
function_call input_to_array

テスト

以下のような入力ファイルがあります。

cat filename
1 2 3 4
5
6
7
8

ご覧のように、テストのために入力でも複数行を使用しています。

ここで、上記のスクリプトを実行すると、次の出力が得られます。

1
2
3
4
5
6
7
8

入力ファイルを変更して引数の数を減らし、少ない引数で実行すると、以下の出力が得られます。

1
2
3
4

参照

https://stackoverflow.com/questions/16461656/bash-how-to-pass-array-as-an-argument-to-a-functionhttps:// stackoverflow。 com/a/5257398/1742825

3
Ramesh