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
されています。名前参照最初のパラメーターに名前が渡される変数、_out
2 番目のパラメーターに渡される変数。
その後、関数内でまたはが参照されると、$_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