
だから一般的に関数をたくさん作成し、関数を呼び出すときに変数名を直接定義したいです。デフォルトのテキスト、数字の場合に機能します。これが私が行う方法です。
function func_get_device_hostname
{
local _device_hostname=$1
local device_hostname2="TEST"
eval $_device_hostname="'$device_hostname2'"
}
function func_display_device_hostname
{
func_get_device_hostname device_hostname
echo $device_hostname
}
しかし、このような配列に同じ方法を使用すると、
function func_get_vds_ip
{
func_get_vds_count vds_count
local _arr_vds_ip=$1
arr_vds_ip2=()
i=1
while [ $i -le $vds_count ]; do
local arr_vds_ip2+=($(avahi-browse -rvpc vds._tcp | grep "=;" | cut -d ';' -f8 | sed -n $i' p'))
i=$(($i+1))
done
echo ""
eval $_arr_vds_ip="'$arr_vds_ip2'"
}
function func_display_vds_ip
{
func_get_vds_ip arr_vds_ip
echo -n "VDS IP "
for i in "${arr_vds_ip[@]}"
do
echo -n "$i"
echo -n " - "
done
}
次のエラーが発生します。
line 339: {arr_vds_ip[@]}=192.168.18.82: command not found
行339はコードのこの部分を表します。
eval $_arr_vds_ip="'$arr_vds_ip2'"
最良のアプローチは何ですか?私は間違ったコマンドを使用しましたか?
答え1
使用している可能性があります名前参照(望むよりシェルパラメータ「nameref」を検索してください。)namerefが宣言されたら、ローカル変数を通常の変数のように使用すると、その内容が参照変数に反映されます。
簡単な場合:
function func_get_device_hostname {
local -n _device_hostname=$1
local name=TEST
_device_hostname=$name
}
テスト
$ declare -p foo
bash: declare: foo: not found
$ func_get_device_hostname foo
$ declare -p foo
declare -- foo="TEST"
配列の場合:
function func_get_vds_ip {
local -n _arrname=$1
local count=10 i
_arrname=()
for ((i=1; i<=count; i++)); do
_arrname+=($RANDOM)
done
}
テスト
$ declare -p bar
bash: declare: bar: not found
$ func_get_vds_ip bar
$ declare -p bar
declare -a bar=([0]="23299" [1]="13876" [2]="24702" [3]="17413" [4]="14999" [5]="16309" [6]="25625" [7]="29001" [8]="7117" [9]="23532")