Bashでファイルコンテンツを複数のパラメータに渡す方法

Bashでファイルコンテンツを複数のパラメータに渡す方法

時間の経過とともに更新されるデータ(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単語区切り文字が含まれていますが、デフォルト(ASCIIスペース)が必要なものでなければなりません。

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

あるいは、read組み込み機能を使用することもできます。これは最初の行を読み、残りは無視します(上記の内容に置き換えるだけですcathead -n 1

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

答え2

これは通常、xargs次のような場合に行われます。

xargs myscript.sh < mydata

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

答え3

パラメータを複数のパラメータに渡すのではなく、単一の配列に渡してから、パラメータとして目的の操作を実行します。

#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-function https://stackoverflow.com/a/5257398/1742825

関連情報