Bash에서 배열을 만들고 변수를 배열 이름으로 사용합니다.

Bash에서 배열을 만들고 변수를 배열 이름으로 사용합니다.

이 질문에 대한 답변이 아직 완료되었는지 잘 모르겠습니다. 살펴봤지만 내가 하고 싶은 것과 비슷한 것을 찾지 못했습니다.

ksh 또는 bash 셸에 대해 실행할 수 있는 여러 셸 스크립트가 있으며 배열을 사용합니다. 나는 실행 중인 쉘을 조사하고 배열을 생성하는 데 사용할 내장 함수를 결정하는 "setArray"라는 함수를 만들었습니다. ksh의 경우 set -A, bash의 경우 typeset -a입니다. 그러나 bash 부분에 몇 가지 문제가 있습니다.

이 함수는 배열 이름과 추가할 값이라는 두 가지 매개변수를 사용합니다. 그러면 ${ARRAY_NAME} 및 ${VARIABLE_VALUE}가 됩니다. 다음을 수행하십시오.

set -A $(eval echo \${ARRAY_NAME}) $(eval echo \${${ARRAY_NAME}[*]}) "${VARIABLE_VALUE}"

ksh에서 완벽하게 작동합니다. 하지만,

typeset -a $(eval echo \${ARRAY_NAME})=( $(eval echo \${${ARRAY_NAME}[*]}) "${VARIABLE_VALUE}" )

확실히. 이는 다음을 제공합니다

bash: syntax error near unexpected token '('

문자열 목록(예: MYARRAY="one two three")으로 설정하고 IFS를 사용하여 반복할 수 있다는 것을 알고 있지만 배열 사용 기능도 잃고 싶지 않습니다.

어떤 아이디어가 있나요?

답변1

eval "$ARRAY_NAME"'+=("$VARIABLE_VALUE")'

zsh( 또는 에도 적용됩니다 ksh93).

당신은 ksh88다음과 같아야합니다 :

eval 'set -A '"$ARRAY_NAME"' "${'"$ARRAY_NAME"'[@]}" "${VARIABLE_VALUE}"'

답변2

Bash에서 다음을 수행할 수 있다는 것을 알았습니다.

eval typeset -a $(eval echo \${ARRAY_NAME})=\( $(eval echo \${${ARRAY_NAME}[*]}) "${VARIABLE_VALUE}" \)

내가 변경한 사항은 (1) 앞에 추가하고 eval(2) 우리가 구성한 배열을 구분하는 대괄호를 이스케이프 처리하는 것이었습니다.

typeset -a그러나 교체 후 ksh에서 동일한 명령을 실행하면 set -A실패합니다. 할 수 있나요:

  • typeset/를 완전히 제거하세요 set(변수에 배열을 할당하면 암시적으로 해당 유형이 설정된다고 생각했습니다).

  • 두 개의 쉘 관련 코드가 완전히 분리되도록 코드를 변경하시겠습니까?

+=두 경우 모두 여기에 게시된 코드 조각은 취약해 보입니다 . bash와 ksh 모두에서 사용할 수 있는 추가 연산자를 사용하는 것이 더 좋습니다 .

관련 정보