bash: 배열을 문자열 보존 공백으로 변환

bash: 배열을 문자열 보존 공백으로 변환

공백을 유지하면서 배열을 문자열로 변환하고 싶습니다. 이것이 내가 가진 것입니다:

INPUT=$1
readarray -t arr < <(grep -o . <<< "$INPUT")

echo "${arr[*]}"

${parameter//pat/string}IFS를 로 설정하여 사용하려고 시도했지만 IFS=' '분명히 잘못된 것입니다. 원하는 출력을 생성할 수 없습니다.

printf %q "$IFS"산출$' \t\n'

명령을 사용하여 스크립트를 실행합니다../rev_arr "I'm Hungry!"

산출:

예상 출력:여기에 이미지 설명을 입력하세요.

답변1

문자열을 다시 재구성하기 위해 문자열을 개별 문자로 배열로 읽는 방법은 잘 보이지 않지만 IFS단일 공백으로 설정하면 배열 요소 사이에 단일 공백이 삽입됩니다 "${arr[*]}". 대신 IFS빈 문자열로 설정하세요.

readarray -t arr < <( grep -o . <<<"$1" )
( IFS=''; printf '%s\n' "${arr[*]}" )

IFS나는 스크립트의 나머지 부분에서 값을 변경하지 않도록 서브쉘을 사용하여 as 및 as를 할당했습니다 printf.IFS

답변2

*in의 사용은 "${arr[*]}"소개입니다첫 번째 문자배열의 각 요소에 대한 구분 기호로 IFS에서 가져옵니다. IFS를 변경해 볼 수 있습니다.

 readarray -t arr < <(grep -o . <<< "$input")
 ( IFS=''; echo "${arr[*]}" )

또는 복잡한 평가 지연을 위해 eval을 사용해 보세요.

 readarray -t arr < <(grep -o . <<< "$input")
 IFS='' eval 'echo "array= ${arr[*]}"'

그러나 간단한 printf만 필요한 경우 하위 쉘을 시작하거나(현재 쉘에서 IFS 변경을 피하기 위해) 평가 위험을 증가시킬 필요가 없습니다.

 readarray -t arr < <(grep -o . <<< "$input")
 printf '%s' "${arr[@]}" $'\n'

grep은 내부 개행 문자를 모두 제거한다는 점에 유의하세요 $input.

배열 요소에서 개행 문자를 얻으려면(작은 입력의 경우):

 [[ $input =~ ${input//?/(.)} ]] && arr=("${BASH_REMATCH[@]:1}")
 printf '%s' array= "${arr[@]}" $'\n'

관련 정보