bash의 새 줄에 배열의 각 요소를 사용하여 파일에 배열 인쇄


13

배열의 내용을 파일의 새 줄에 배열의 각 요소가있는 파일로 시도하고 있습니다.

IFS=$'\n'   
echo "${mtches[@]}" > sample1.txt 


mtches의 내용은 "qwe"및 "asd"입니다. 그러나 sample1.txt파일에는 qwe asd한 줄로 들어 있습니다 . 왜 그림에 IFS 가치를 부여하지 않습니까?

답변:


17

당신은 사용해야하는 printf대신echo :

printf "%s\n" "${mtches[@]}"

mtches비어있는 경우 여전히 빈 줄 하나가 출력됩니다. 이를 설명하기 위해 :

{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file

에서 bash(또한 POSIX 쉘), 당신은 자주 사용하는 위치 매개 변수 배열"$@"대신 "$*"당신은 특별한 이유가없는 한,. man bash-section Arrays에서 일반 배열 을 지원하는 쉘에서도 마찬가지입니다 .

배열의 모든 요소는 $ {name [subscript]}를 사용하여 참조 할 수 있습니다. 쉘의 파일 이름 확장 연산자와 충돌을 피하기 위해 중괄호가 필요합니다. 아래 첨자가 '@'또는 '*'이면 단어가 배열 이름의 모든 멤버로 확장됩니다. 이 첨자는 단어가 큰 따옴표 안에있을 때만 다릅니다. 단어를 큰 따옴표로 묶으면 $ {name [*]}은 각 배열 구성원의 값을 IFS 변수의 첫 문자로 구분하여 단일 단어로 확장하고 $ {name [@]}은 각 이름 요소를 확장합니다. 별도의 단어로. 배열 구성원이 없으면 $ {name [@]}은 확장되지 않습니다. 큰 따옴표로 묶인 확장이 단어 내에서 발생하면 첫 번째 매개 변수의 확장은 원래 단어의 시작 부분과 연결되고 마지막 매개 변수의 확장은 원래 단어의 마지막 부분과 연결됩니다.

"${array[*]}"모든 배열 요소를 문자열에 결합하려는 경우 에만 사용하십시오 .


그것이 어떻게 차이를 만드는가?
Ashwin


7

${mtches[*]}대신 사용하고 싶습니다 .

을 사용할 때 "${mtches[@]}"값이 무엇인지는 중요하지 않습니다 $IFS.bash는 배열을 여러 인수로 나눕니다. 원하는 것은 각 배열 요소가 결합 된 단일 인수입니다 \n. ${mtches[*]}이것을 달성합니다.

또한 임시 설정 방법으로 $IFS다음을 수행 할 수 있습니다.

( IFS=$'\n'; echo "${mtches[*]}" > sample1.txt )

그런 다음 다시 설정하지 않아도됩니다.


pubs.opengroup.org/onlinepubs/9699919799/utilities/… <-POSIX 참조 (이것은 배쉬에만 적용되지 않습니다).
Mat

또는 사용 printf...
jasonwryan

2

사용 을 위해 :

for each in "${alpha[@]}"
do
  echo "$each"
done

역사 사용하기 ; 값에 다음이 포함되어 있으면 실패합니다 !.

history -p "${alpha[@]}"

basename 사용 ; 값에 다음이 포함되어 있으면 실패합니다 /.

basename -a "${alpha[@]}"

shuf 사용 ; 결과가 순서대로 나오지 않을 수 있습니다.

shuf -e "${alpha[@]}"

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