Bash retorna um array associativo de uma função e então passa aquele array associativo para outras funções [closed]

2

Estou tentando criar um array associativo em uma função a partir de uma lista passada por meio de um argumento, mas isso não está funcionando:

#!/usr/bin/env bash



function cwd {
  echo "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
}


function list_commands {
  local root="$1"
  local command_list="${*:2}"
  declare -A cmds
  for cmd in $command_list; do
    cmds["#{$cmd}"]+="$root/scripts/displays/$cmd.sh #{pane_current_path} #{pane_id}"
  done
  echo "$cmds"
}

PLUGIN_ROOT_DIR="$(cwd)"

declare -A cmds=$(list_commands "$PLUGIN_ROOT_DIR" "rbenv_ruby_ver githud")

main "$cmds"

Não sei o que fazer, bash scripting não é o meu ponto strong (embora eu esteja melhorando nisso)

o que posso fazer para que isso funcione?

Lembre-se de que isso será executado no tmux como parte de um plugin tpm tmux.

    
por Thermatix 12.08.2018 / 01:47

1 resposta

2

As estruturas de dados que não sejam strings não podem ser realmente passadas entre as funções do shell. No entanto, você pode usar referências de nomes para passar nomes de matrizes associativas (ou de qualquer outra variável que você queira). Referências de nomes estão disponíveis em bash desde a versão 4.3.

Exemplo:

foo () {
    declare -n aarr="$1"

    aarr["fookey"]=foovalue
}

declare -A myarray

myarray["mainkey"]=mainvalue
foo myarray

for key in "${!myarray[@]}"; do
    printf '%s = %s\n' "$key" "${myarray[$key]}"
done

Observe que bash requer que o nome da variável de referência de nome ( aarr acima) não seja igual ao nome da variável referenciada ( myarray acima).

Teste:

$ bash script.sh
fookey = foovalue
mainkey = mainvalue
    
por 12.08.2018 / 09:36