답변:
당신은 사용해야하는 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[*]}"모든 배열 요소를 문자열에 결합하려는 경우 에만 사용하십시오 .
${mtches[*]}대신 사용하고 싶습니다 .
을 사용할 때 "${mtches[@]}"값이 무엇인지는 중요하지 않습니다 $IFS.bash는 배열을 여러 인수로 나눕니다. 원하는 것은 각 배열 요소가 결합 된 단일 인수입니다 \n. ${mtches[*]}이것을 달성합니다.
또한 임시 설정 방법으로 $IFS다음을 수행 할 수 있습니다.
( IFS=$'\n'; echo "${mtches[*]}" > sample1.txt )
그런 다음 다시 설정하지 않아도됩니다.
printf...
for ENTRY in ${ARRAY[@]}; do
echo $ENTRY
done > outfile
훌륭하고 읽기 쉽고 IFS를 망쳐 놓는 것은 아닙니다. 또한 각 라인의 처리를 사용자 정의 할 수 있음을 의미합니다.
echo임의의 내용에 사용할 수없는 및 사용자 변수를 인용하는 것을 잊었다 . 약간 더 나은 버전이 StevenPenny에 의해 이미 게시되었습니다