時間とともに更新されるデータ(mydata)を含むファイルがあります。ファイルは次のようになります。
1 2 3
このファイルを使用して、これを行います(基本的に、各数値を個別のパラメーターとして処理します)。
myscript.sh 1 2 3
データは静的ではなく、時間とともに更新されるため、次のコマンドを実行します。
myscript.sh "$(cat mydata)"
しかし、代わりに./myscript.sh:1行目1:1:コマンドが見つかりません
私は何をすべきか?
"$(cat mydata)"
は、ファイルの内容mydata
から末尾の改行を差し引いた文字列に評価されます。必要なのは、ファイル内の空白で区切られた単語のリストです。したがって、一度は、二重引用符の外でコマンド置換を使用します。
myscript.sh $(cat mydata)
堅牢性を高めるには、グロビングをオフにします。これにより、mydata
の列に\[*?
のいずれかの文字が含まれている場合、ファイル名パターンとして解釈されません。 IFS
を設定してWordの区切り文字を含めることもできますが、デフォルト(ASCIIの空白)が必要なものになっているはずです。
(set -f; myscript.sh $(cat mydata))
または、read
ビルトインを使用することもできます。これにより、最初の行が読み取られ、残りは無視されます(cat
をhead -n 1
で置き換えることにより、上記で実行できます)。
read -r one two three rest <mydata
myscript.sh "$one" "$two" "$three"
通常、これがxargs
の目的です。
xargs myscript.sh < mydata
xargs
は、入力を空白または改行で区切られた単語と見なします。区切り文字をエスケープするために、単一引用符、二重引用符、またはバックスラッシュが使用されます。 xargs
は、コマンドに渡される引数(および環境)のサイズの制限を回避するために、必要な回数だけコマンドを実行します。
複数の引数として渡す代わりに、引数を単一の配列として渡して、引数に対して必要なことをすべて実行します。
#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