배열을 파일로 인쇄하고 배열의 각 요소를 bash의 새 줄에 넣습니다.

배열을 파일로 인쇄하고 배열의 각 요소를 bash의 새 줄에 넣습니다.

배열의 내용을 파일에 넣고 배열의 각 요소를 파일의 새 줄에 배치하려고 합니다.

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


mtches의 내용은 "qwe"와 "asd"입니다. 하지만 파일은 한 줄에 sample1.txt포함되어 있습니다 . qwe asdIFS 가치를 고려하지 않는 이유는 무엇입니까?

답변1

printf대신 사용해야합니다echo:

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를 망칠 의도는 없습니다. 이는 또한 각 행의 처리를 사용자 정의할 수 있음을 의미합니다.

관련 정보