配列を関数パラメータとして渡しますが、他の追加パラメータを使用するには?

配列を関数パラメータとして渡しますが、他の追加パラメータを使用するには?

次の投稿解決策期待どおりに動作します。

だから - 彼の答えで判断すると:

function copyFiles() {
   arr=("$@")
   for i in "${arr[@]}";
      do
          echo "$i"
      done

}

array=("one 1" "two 2" "three 3")

copyFiles "${array[@]}"

この記事を書く理由は、次のような場合に何をすべきかです。

copyFiles "${array[@]}" "Something More"
copyFiles "Something More" "${array[@]}"

質問:送信された引数と受信された引数が関数にあることを知っています。実際にはマージされているため、$1$2配列」パラメータは期待どおりに機能しなくなります。統合別の主張で

私は研究しました:

typeset -n悲しいことにいいえ働く

そして:

するいいえ${#array[@]}期待どおりに動作します。この回答には、関数内で配列サイズ()が異なる場合のデモテスト/検証リンクで問題があるという説明があります。

それでは、この目標を達成する方法は?

ベストアンサー1

このように、配列をパラメータとして渡すことはできません。したように見えますが、期待どおりに機能しません。

あなたのシェル(例:ここ:)は個々のプロジェクトにbash拡張されます。"${array[@]}"今後機能を実行してみてください!

だからこれ

copyFiles "Something More" "${array[@]}"

実際に電話をかける

copyFiles "Something More" "one 1" "two 2" "three 3"

したがって、関数内の他のパラメータと配列を区別することは不可能です。

(あなたできる 配列への参照を追加するしかし、移植性が低下しているように見え、必要でない場合は範囲​​を混在させたくないので、使用しないことをお勧めします。


shiftたとえば、を使用できます。

copyFiles() {
    var1=$1
    shift
    for i in "$@"; do ... ; done
}

(これはarr=("$@")重複してすでに配列なので、$@指定する必要はなく、"$@"単に使用することもできますfor i; do ...; done。)

または、次のパラメータを解析します。getopts

おすすめ記事