22

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
  • 1,054
  • 1
  • 14
  • 28
Alec Beyer
  • 263
  • 1
  • 2
  • 7

6 Answers6

36

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,578
  • 1
  • 41
  • 51
  • 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
  • 497,756
  • 71
  • 530
  • 681
7

One way :

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

The - is not mandatory on Linux, but could be necessary on some Unices*

or simply :

printf '%s ' "${myArray[@]}"
Gilles Quénot
  • 173,512
  • 41
  • 224
  • 223
  • 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. –  Oct 12 '16 at 01:54
3

My favourite trick is

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

user1699917
  • 1,510
  • 1
  • 10
  • 5
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
  • 4
Arindam Roychowdhury
  • 5,927
  • 5
  • 55
  • 63
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
  • 795
  • 1
  • 8
  • 13