배열의 내용을 파일에 넣고 배열의 각 요소를 파일의 새 줄에 배치하려고 합니다.
IFS=$'\n'
echo "${mtches[@]}" > sample1.txt
mtches의 내용은 "qwe"와 "asd"입니다. 하지만 파일은 한 줄에 sample1.txt
포함되어 있습니다 . qwe asd
IFS 가치를 고려하지 않는 이유는 무엇입니까?
답변1
printf "%s\n" "${mtches[@]}"
비어 있으면 mtches
빈 줄이 계속 출력됩니다. 이걸 고려하세요:
{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file
(및 POSIX 쉘) 에서는 bash
자주 사용합니다.위치 매개변수 배열특별한 이유가 없는 한 "$@"
대신 으로 사용하세요. "$*"
지원되는 쉘에서도 마찬가지입니다.man bash의 일반 배열 - 배열 섹션:
${name[subscript]}를 사용하여 배열의 모든 요소를 참조할 수 있습니다. 쉘의 파일 이름 확장 연산자와의 충돌을 방지하려면 중괄호가 필요합니다. 아래 첨자가 "@" 또는 "*"인 경우 단어는 배열 이름의 모든 구성원으로 확장됩니다. 이러한 아래첨자는 단어가 큰따옴표 안에 나타날 때만 다릅니다. 단어가 큰따옴표로 묶인 경우 ${name[*]}은 IFS 변수의 첫 번째 문자로 구분된 각 배열 구성원의 값을 사용하여 단일 단어로 확장되는 반면 ${name[@]}은 각 단어를 확장합니다. 이름 요소를 별도의 단어로 변환합니다. 배열 멤버가 없으면 ${name[@]}은 비어 있는 상태로 확장됩니다. 단어 내에서 큰따옴표 확장이 발생하는 경우 첫 번째 인수의 확장은 원래 단어의 시작 부분과 연결되고 마지막 인수의 확장은 원래 단어의 마지막 부분과 연결됩니다. 이는 특수 매개변수 "@" 및 "*"의 확장과 유사합니다.
"${array[*]}"
모든 배열 요소를 문자열에 연결하려는 경우에만 사용하십시오.
답변2
대신 사용하고 싶습니다 ${mtches[*]}
.
bash를 사용하면 "${mtches[@]}"
값이 무엇이든 관계없이 $IFS
배열을 여러 인수로 분할합니다 . 원하는 것은 각 배열 요소가 로 결합되는 매개변수입니다 \n
. ${mtches[*]}
이것을 달성하십시오.
또는 임시 설정으로 $IFS
다음을 수행할 수 있습니다.
( IFS=$'\n'; echo "${mtches[*]}" > sample1.txt )
그러면 굳이 다시 설정하지 않아도 됩니다.
답변3
사용~을 위한:
for each in "${alpha[@]}"
do
echo "$each"
done
사용역사;값에 다음이 포함되면 실패합니다 !
.
history -p "${alpha[@]}"
사용기본 이름;값에 다음이 포함되면 실패합니다 /
.
basename -a "${alpha[@]}"
사용쉿;결과가 순서대로 표시되지 않을 수 있습니다.
shuf -e "${alpha[@]}"
답변4
for ENTRY in ${ARRAY[@]}; do
echo $ENTRY
done > outfile
예쁘고 읽기 쉬우며 IFS를 망칠 의도는 없습니다. 이는 또한 각 행의 처리를 사용자 정의할 수 있음을 의미합니다.