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와 마찬가지로 함수에서 사용되는 변수에 의해 함수가 호출되는 위험을 제한하기 위해 함수에 변수 이름 앞에 접두사를 붙입니다 . 거친면 소포체.
¹ typeset
ksh도 여기서 유래되었습니다. 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