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.

우리는 통과이름이 함수의 두 가지 변수. 이 함수는 내부적 으로 다음과 같이 _in정의됩니다 .이름 참조첫 번째 매개변수에 이름이 전달되는 변수, _out두 번째 매개변수에 전달되는 변수입니다.

그런 다음 함수 내에서 또는 가 참조되면 $_in자동으로 참조된 함수로 변환됩니다.$_out

_nameref 기능이 1 또는 zsh2에서 나오는 ksh93과 달리 bash와 마찬가지로 함수에서 사용되는 변수에 의해 함수가 호출되는 위험을 제한하기 위해 함수에 변수 이름 앞에 접두사를 붙입니다 . 거친면 소포체.


¹ typesetksh도 여기서 유래되었습니다. 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

관련 정보