이 질문에 대한 답변이 아직 완료되었는지 잘 모르겠습니다. 살펴봤지만 내가 하고 싶은 것과 비슷한 것을 찾지 못했습니다.
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 모두에서 사용할 수 있는 추가 연산자를 사용하는 것이 더 좋습니다 .