문자열 대체를 사용하여 배열을 결합하려고 합니다. 산출:
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#?}
첫 번째 문자(우리가 추가한 쉼표)를 제거합니다.