구분 기호를 사용할 때 readarray로 추가 된 새 줄을 제거하는 방법은 무엇입니까?


답변:


13

암시 후행 개행 문자입니다 하지 에 의해 추가 readarray내장,하지만 여기에 문자열 (가 <<<)의 bash참조 떠들썩한 여기에 문자열이 뒤에 줄 바꿈 문자를 추가 않는 이유는 무엇입니까? . 줄 바꿈없이 문자열을 인쇄하여 printf프로세스 대체 기술을 통해 읽음으로써이를 제거 할 수 있습니다.< <()

readarray -td, ARR < <(printf '%s' "$VAR")
declare -p ARR

지금 제대로 생성

declare -a ARR=([0]="a" [1]="b" [2]="c" [3]="d")

3
와! 나는 이것을 찾지 못했을 것이다. 감사합니다
user1156544 10

4

split + glob를 사용할 수 있습니다 (목록 컨텍스트에서 확장을 인용 부호로 남겨두면 어떻게됩니까). 대부분의 경우 방해가되므로 실제로 필요할 때 사용하지 않는 것은 부끄러운 일입니다.

IFS=,
set -o noglob

ARR=($VAR) # split+glob with glob disabled, and split using , as delimiter

그것은 임시 파일을 쓰는 것보다 조금 덜 복잡 readarray하고 readarray <<< "$string"접근 방식 과 같이 호출 합니다 ( readarray -d최신 버전의 버전 이 필요합니다 bash).

참고는에도 불구하고 있음 S에가 IFS(의미있는 분리 ), 즉 같은 방식으로 작동 readarray한다는 점에서 a,,b,로 분할 "a", ""그리고 "b"단지.

실제 분할 연산자의 경우 zsh대신 사용할 수 있습니다 .

ARR=("${(@s:,:)VAR}")

( @빈 요소를 보존하기 위해 및 큰 따옴표).


readarray <<< "$string"tempp 파일에 기록하고 메모리를 사용하는 대신 그것을 삭제?
user1156544

@ user1156544 예.
mosvy

bash에서 마지막 명령과 비슷한 것을 어떻게 할 수 있습니까? 나는 bash 3.3을 사용하고 있으며 부족한 부분을 보완하려고 노력하고있다readarray -d
user1156544

3

@ StéphaneChazelas '답변의 통조림 버전 :

# usage: setarray varname sep string
setarray(){ declare -n a=$1; local IFS=$2 -; set -f; a=($3); }

$ setarray arr , 1,2,3,
$ declare -p arr
declare -a arr=([0]="1" [1]="2" [2]="3")

$ setarray path : "$PATH"
$ setarray ld_preload ': ' "$LD_PRELOAD" # its elements can be separated by either ':' or spaces
...

local -같은 옵션을 만들 것입니다 set -f( noglob다만 변수로 함수에 지역을).

는 로 명명 된 전역 변수 (함수의 첫 번째 인수) 의 별칭으로 로컬 변수 를 declare -n a=$1만듭니다 .a$1

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.