bash関数に配列を渡す

bash関数に配列を渡す

namerefを使用して配列をbash関数に入力として渡すには?これを行う方法に関する具体的な情報が見つかりませんでした。

たとえば、配列があり、inclそれを関数に渡すと、関数はそれを返そうとしますisufx

## Split INCL by field separator FS
for ext in "${incl[@]}"; do

  if [[ "$ext" == "PROGL" ]]; then
    isufx+=( --include=\*.{rc,el,c,f} )
    (( vb >= 2 )) && echo " ext: $ext"
    continue
  elif [[ "$ext" == "PEXTD" ]]; then
    isufx+=( --include=\*.{rc,el,c,f} )
    isufx+=( --include=\*.{cp,cpp,f90,f95,f03,f08} )
    (( vb >= 2 )) && echo " ext: $ext"
    continue
  elif [[ "$ext" == "TYPOG" ]]; then
    isufx+=( --include=\*.{org,texi,tex} )
    (( vb >= 2 )) && echo " ext: $ext"
    continue
  fi

答え1

fill_array()
  typeset -n _in="$1" _out="$2"
  typeset _ext
  for _ext in "${_in[@]}"; do
    case $_ext in
      (PEXTD) _out+=( '--include=*.'{cp,cpp,f90,f95,f03,f08} ) ;& # fall through
      (PROGL) _out+=( '--include=*.'{rc,el,c,f} ) ;;
      (TYPOG) _out+=( '--include=*.'{org,texi,tex} ) ;;
      (*) continue
    esac
    (( vb < 2 )) || printf>&2 ' ext: %s\n' "$_ext"
  done
}

fill_array incl isufx

caseここでは、oneよりも適切に見える表現も使用されましたif

私たちは渡す名前この関数の2つの変数。この関数は内部的に次のように定義_inされています。名前参照最初のパラメーターに名前が渡される変数、_out2 番目のパラメーターに渡される変数。

その後、関数内でまたはが参照されると、$_in自動的に参照された関数に変換されます。$_out

_nameref機能が1またはzsh2から来るksh93とは異なり、bashと同様に、関数で使用される変数によって関数が呼び出されるリスクを制限するために、関数に変数名の前に接頭辞を付けます。粗い綿の小胞体。


¹kshtypesetもここに由来しています。bashその関数が数十年後にコピーされましたが、そのコマンドを呼び出すことにしたという事実declareは私が迷惑なことだと思います。幸いエイリアスとしてもtypeset許可されています。

²この記事を書いている時点で、namerefは現在の開発バージョンでのみ利用可能です。

答え2

あなたは逃しdone

#!/bin/bash

function my_function() {
  declare -n myarray="$1"
  local isufx=()
  
  for ext in "${myarray[@]}"; do
    if [[ "$ext" == "PROGL" ]]; then
      isufx+=( --include=\*.{rc,el,c,f} )
      (( vb >= 2 )) && echo " ext: $ext"
      continue
    elif [[ "$ext" == "PEXTD" ]]; then
      isufx+=( --include=\*.{rc,el,c,f} )
      isufx+=( --include=\*.{cp,cpp,f90,f95,f03,f08} )
      (( vb >= 2 )) && echo " ext: $ext"
      continue
    elif [[ "$ext" == "TYPOG" ]]; then
      isufx+=( --include=\*.{org,texi,tex} )
      (( vb >= 2 )) && echo " ext: $ext"
      continue
    fi
  done
  
  echo -e "${isufx[@]}"
}

my_include=("PROGL" "EMPTY" "PEXTD" "TYPOG" "NONAME")
my_function my_include

exit

関連情報