
時間の経過とともに更新されるデータ(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
組み込み機能を使用することもできます。これは最初の行を読み、残りは無視します(上記の内容に置き換えるだけですcat
)head -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