Bash는 함수에서 연관 배열을 반환하고 해당 연관 배열을 다른 함수에 전달합니다.

Bash는 함수에서 연관 배열을 반환하고 해당 연관 배열을 다른 함수에 전달합니다.

매개변수로 전달된 목록에서 함수의 연관 배열을 작성하려고 하는데 작동하지 않습니다.

#!/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"

어떻게 해야 할지 모르겠습니다. bash 스크립팅은 저의 장점이 아닙니다(비록 점점 나아지고 있지만).

이 작업을 수행하려면 어떻게 해야 합니까?

이는 tpm tmux 플러그인의 일부로 tmux에서 수행된다는 점을 명심하세요.

답변1

문자열 이외의 데이터 구조는 실제로 쉘 함수 간에 전달될 수 없습니다. 그러나 이름 참조를 사용하여 연관 배열(또는 원하는 다른 변수)의 이름을 전달할 수 있습니다. bash버전 4.3부터 이름 참조가 가능합니다.

예:

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

bash참조 변수 이름( aarr위)은 참조 변수 이름(위)과 달라야 한다는 요구 사항에 유의하세요 myarray.

시험:

$ bash script.sh
fookey = foovalue
mainkey = mainvalue

관련 정보