Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I am trying the contents of an array into a file with each element of the array in a new line in the file.

echo "${mtches[@]}" > sample1.txt 

The content of mtches is "qwe" and " asd". But the sample1.txt file contains qwe asd in a single line. Why is it not taking IFS value into the picture?

share|improve this question
up vote 7 down vote accepted

You should use printf instead of echo:

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

In bash (and also POSIX shells), you often use Positional Parameters array as"$@" instead of "$*", except you have a special reason. That's also true in shell support regular arrays, from man bash - section Arrays:

Any element of an array may be referenced using ${name[subscript]}. The braces are required to avoid conflicts with the shell’s filename expansion operators. If the subscript is ‘@’ or ‘*’, the word expands to all members of the array name. These subscripts differ only when the word appears within double quotes. If the word is double-quoted, ${name[*]} expands to a single word with the value of each array member separated by the first character of the IFS variable, and ${name[@]} expands each element of name to a separate word. When there are no array members, ${name[@]} expands to nothing. If the double-quoted expansion occurs within a word, the expansion of the first parameter is joined with the beginning part of the original word, and the expansion of the last parameter is joined with the last part of the original word. This is analogous to the expansion of the special parameters ‘@’ and ‘*’

Only use "${array[*]}" when you want join all array elements to a string.

share|improve this answer
How does that make a diference? – Ashwin Apr 20 '14 at 8:54
@Ashwin unix.stackexchange.com/questions/65803/… – jasonwryan Apr 20 '14 at 8:57

You want to use ${mtches[*]} instead.

When you use "${mtches[@]}", it doesn't matter what the value of $IFS is, bash will split the array into multiple arguments. What you want is a single argument with each array element joined by \n. ${mtches[*]} accomplishes this.

Also as a temporary way of setting $IFS, you can do:

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

Then you don't have to bother with setting it back.

share|improve this answer
pubs.opengroup.org/onlinepubs/9699919799/utilities/… <- POSIX reference (this does not apply only to bash). – Mat Apr 20 '14 at 8:52
Or use printf... – jasonwryan Apr 20 '14 at 8:52

Using for:

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

Using history; note this will fail if your values contain !:

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

Using basename; note this will fail if your values contain /:

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

Using shuf; note that results might not come out in order:

shuf -e "${alpha[@]}"
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.