web-dev-qa-db-ja.com

Bashの関数に引数として配列を渡す方法

知っているように、bashプログラミングでは、引数を渡す方法は$1、...、$Nです。しかし、複数の引数を受け取る関数に引数として配列を渡すのは簡単ではないことがわかりました。次に例を示します。

f(){
 x=($1)
 y=$2

 for i in "${x[@]}"
 do
  echo $i
 done
 ....
}

a=("jfaldsj jflajds" "LAST")
b=NOEFLDJF

f "${a[@]}" $b
f "${a[*]}" $b

説明したように、関数fは2つの引数を受け取ります。最初の引数は配列であるxに割り当てられ、2番目の引数はyに割り当てられます。

fは2つの方法で呼び出すことができます。最初の方法では、"${a[@]}"を最初の引数として使用します。結果は次のとおりです。

jfaldsj 
jflajds

2番目の方法では、"${a[*]}"を最初の引数として使用し、結果は次のようになります。

jfaldsj 
jflajds 
LAST

どちらの結果も私が望んだ通りではありません。だから、関数間で配列を正しく渡す方法について考えている人はいますか?

42
Red Lv

配列を渡すことはできません。その要素(つまり、拡張された配列)のみを渡すことができます。

#! /bin/bash
function f() {
    a=("$@")
    ((last_idx=${#a[@]} - 1))
    b=${a[last_idx]}
    unset a[last_idx]

    for i in "${a[@]}" ; do
        echo "$i"
    done
    echo "b: $b"
}

x=("one two" "LAST")
b='even more'

f "${x[@]}" "$b"
echo ===============
f "${x[*]}" "$b"

他の可能性は、名前で配列を渡すことです:

#! /bin/bash
function f() {
    name=$1[@]
    b=$2
    a=("${!name}")

    for i in "${a[@]}" ; do
        echo "$i"
    done
    echo "b: $b"
}

x=("one two" "LAST")
b='even more'

f x "$b"
67
choroba

Bash 4.3+の関数への参照によって配列を渡すことができます。これはおそらくkshから来ていますが、構文は異なります。重要な考え方は、-n属性を設定することです。

show_value () # array index
{
    local -n array=$1
    local idx=$2
    echo "${array[$idx]}"
}

これはインデックス配列に対して機能します:

$ shadock=(ga bu zo meu)
$ show_value shadock 2
zo

また、連想配列でも機能します。

$ days=([monday]=eggs [tuesday]=bread [sunday]=jam)
$ show_value days sunday
jam

Manページのdeclare -nも参照してください。

28
Edouard Thiel

最初に「スカラー」値を渡すことができます。それは物事を単純化するでしょう:

f(){
  b=$1
  shift
  a=("$@")

  for i in "${a[@]}"
  do
    echo $i
  done
  ....
}

a=("jfaldsj jflajds" "LAST")
b=NOEFLDJF

f "$b" "${a[@]}"

この時点で、配列のような定位置パラメーターを直接使用することもできます

f(){
  b=$1
  shift

  for i in "$@"   # or simply "for i; do"
  do
    echo $i
  done
  ....
}

f "$b" "${a[@]}"
6
glenn jackman

これにより、関数に配列を渡す問題が解決します。

#!/bin/bash

foo() {
    string=$1
    array=($@)
    echo "array is ${array[@]}"
    echo "array is ${array[1]}"
    return
}
array=( one two three )
foo ${array[@]}
colors=( red green blue )
foo ${colors[@]}
0
Lavitha