문자열 대체를 사용하여 배열을 결합하시겠습니까? [복사]

문자열 대체를 사용하여 배열을 결합하시겠습니까? [복사]

문자열 대체를 사용하여 배열을 결합하려고 합니다. 산출:

a,b,c

다음 방법이 작동하지만 파이프 없이 수행할 수 있는 방법이 있습니까?

#!/bin/bash

words=(a b c)

echo "${words[@]}" | sed 's/ /,/g'

나는 이것을 시도했지만 작동하지 않습니다.

echo "${words[@]// /,/}"

답변1

특정 문자로 구분된 배열 요소로 구성된 문자열을 출력하려면 다음을 사용하십시오.

words=(a b c)

( IFS=,; printf '%s\n' "${words[*]}" )

in 대신 in을 사용하면 *배열의 모든 요소를 ​​연결하여 문자열을 생성합니다. 요소는 의 첫 번째 문자로 구분되므로 확장을 수행하기 전에 쉼표로 설정합니다.@"${words[*]}"words$IFS

IFS호출을 위해 쉼표로 구분된 문자열을 생성하는 데 필요한 단일 확장 이외의 다른 항목으로 실수로 설정하는 것을 방지하기 위해 하위 쉘에 설정 했습니다 printf.

IFS서브셸을 사용하여 로컬로 설정하는 대신 설정하고 재설정할 수 있습니다.

words=(a b c)

IFS=,$IFS
printf '%s\n' "${words[*]}"
IFS=${IFS#?}

먼저 쉼표를 첫 번째 문자로 추가하고 $IFS변수의 이전 값을 쉼표 뒤의 문자로 유지합니다.

매개변수 대체는 ${IFS#?}첫 번째 문자(우리가 추가한 쉼표)를 제거합니다.

관련 정보