파이프로 구분된 쉘 변수의 내용을 배열 변수에 대한 입력으로 전달하는 방법

파이프로 구분된 쉘 변수의 내용을 배열 변수에 대한 입력으로 전달하는 방법

다음 변수의 데이터를 동적 배열로 처리하는 데 문제가 있습니다.

variable_1='A|B|C|D' -> dynamic_array=(A B C D)

sed 명령을 사용하여 '|'를 공백으로 바꾸고 데이터를 Dynamic_array에 전달하는 방법을 시도했습니다.

한 줄의 코드로 이를 수행할 수 있는 방법이 있습니까?

답변1

변경할 필요가 없습니다 IFS.배쉬 4.4부터 시작:

readarray -td '|' arr < <(printf '%s' "$var")
$ var='A|B|C|D'
$ readarray -td '|' arr < <(printf '%s' "$var")
$ echo "${arr[0]}"; echo "${arr[3]}"
A
D

바라보다help readarray설명하다.

참고: 이전 제안( readarray -td '|' arr <<< "$var")은 더 짧지만 Freddy가 지적한 것처럼 마지막 배열 요소에 가짜 개행 문자를 삽입합니다.

답변2

가정 bash:


단어 분사를 활용할 수 있습니다. 내부 필드 구분 기호(IFS)의 기본값은 공백, 탭 또는 줄 바꿈입니다. 그러나 환경 변수를 설정하여 이를 재정의할 수 IFS있으며 그런 다음 일반적인 방법을 사용하여 변수를 만들 수 있습니다.

set -f # disable filename expansion
IFS='|' arr=($variable_1)

또는 declare:

IFS='|' declare -a 'arr=($variable_1)'

또는 read:

IFS='|' read -ra arr  <<<  "$variable_1"

이와 같은 변수를 변경하는 경우 IFS먼저 다른 변수에 저장한 후 재설정해야 할 수도 있습니다.

OLD_IFS="$IFS"
# my commands
IFS="$OLD_IFS"

답변3

가정적으로 요소에 포함된 모든 문자 또는 비문자에 적용되는 매개변수 확장 플래그를 zsh사용할 수 있습니다 .s

$ string=$'first element|second\nbinary\x80element\0||second-last|'
$ array=("${(@s[|])string}")
$ typeset -p string array
typeset string=$'first element|second\nbinary\M-\C-@element\C-@||second-last|'
typeset -a array=( 'first element' $'second\nbinary\M-\C-@element\C-@' '' second-last '' )

빈 문자열은 빈 요소( string=''gets array=( '' ), not array=( ))로 분할됩니다.

관련 정보