19

I am reading in filetype data into a bash array and need to print its contents out on the same line with spaces.

#!/bin/bash

filename=$1
declare -a myArray

readarray myArray < $1

echo "${myArray[@]}" 

I try this and even with the echo -n flag it still prints on newlines, what am I missing, would printf work better?

I0_ol
  • 951
  • 11
  • 28
Alec Beyer
  • 233
  • 1
  • 2
  • 7

6 Answers6

30

Simple way to print in one line

echo "${myArray[*]}"

example:

myArray=(
one
two
three
four
[5]=five
)

echo "${myArray[*]}"

#Result
one two three four five
DarckBlezzer
  • 4,100
  • 1
  • 38
  • 50
  • What if I wanted formatted output (e.g. comma separated list of single quoted strings) – Prachi Oct 20 '17 at 20:33
  • 1
    @Prachi Use this `echo $(IFS=',';echo "${myArray[*]// /|}";IFS=$'')` , link https://stackoverflow.com/a/13471141/5287072 – DarckBlezzer Oct 20 '17 at 23:22
7

readarray retains the trailing newline in each array element. To strip them, use the -t option.

readarray -t myArray < "$1"
chepner
  • 446,329
  • 63
  • 468
  • 610
5

One way :

printf '%s\n' "${myArray[@]}" | paste -sd ' '

or simply :

printf '%s ' "${myArray[*]}"
Gilles Quenot
  • 154,891
  • 35
  • 213
  • 206
  • 2
    Using * is affected by the first character of "$IFS", which by default it happens to be an space. Using `printf '%s ' "${myArray[@]}"` is more robust. – done Oct 12 '16 at 01:54
1

In case you have the array elements coming from input, this is how you can

  • create an array
  • add elements to it
  • then print the array in a single line

The script:

#!/usr/bin/env bash

declare -a array
var=0
while read line
do
  array[var]=$line
  var=$((var+1))
done

# At this point, the user would enter text. EOF by itself ends entry.

echo ${array[@]}
Brad Town
  • 23
  • 6
Arindam Roychowdhury
  • 4,939
  • 5
  • 53
  • 57
1

My favourite trick is

echo $(echo "${myArray[@]}")

user1699917
  • 1,229
  • 9
  • 5
1

@sorontar's solution posted in a comment was handy:

printf '%s ' "${myArray[@]}"

but in some places the leading space was unacceptable so I implemented this

local str
printf -v str ' %s' "${myArray[@]}"  # save to variable str without printing
printf '%s' "${str:1}"  # to remove the leading space 
Buoy
  • 745
  • 1
  • 8
  • 13