Redirect output to a bash array Redirect output to a bash array shell shell

Redirect output to a bash array


do you really need an array

bash

$ ipAddress="10.78.90.137;10.78.90.149"$ IFS=";"$ set -- $ipAddress$ echo $110.78.90.137$ echo $210.78.90.149$ unset IFS$ echo $@ #this is "array"

if you want to put into array

$ a=( $@ )$ echo ${a[0]}10.78.90.137$ echo ${a[1]}10.78.90.149

@OP, regarding your method: set your IFS to a space

$ IFS=" "$ n=( $(grep -i ipaddress file |  cut -d'=' -f2 | tr ';' ' ' | sed 's/"//g' ) )$ echo ${n[1]}10.78.90.149$ echo ${n[0]}10.78.90.137$ unset IFS

Also, there is no need to use so many tools. you can just use awk, or simply the bash shell

#!/bin/bashdeclare -a arrwhile IFS="=" read -r caption addressesdo case "$caption" in     ipAddress*)        addresses=${addresses//[\"]/}        arr=( ${arr[@]} ${addresses//;/ } ) esacdone < "file"echo ${arr[@]}

output

$ more filefoobaripAddress="10.78.91.138;10.78.90.150;10.77.1.101"foo1ipAddress="10.78.90.137;10.78.90.149"bar1$./shell.sh10.78.91.138 10.78.90.150 10.77.1.101 10.78.90.137 10.78.90.149

gawk

$ n=( $(gawk -F"=" '/ipAddress/{gsub(/\"/,"",$2);gsub(/;/," ",$2) ;printf $2" "}' file) )$ echo ${n[@]}10.78.91.138 10.78.90.150 10.77.1.101 10.78.90.137 10.78.90.149


This one works:

n=(`grep -i ipaddress filename | cut -d"=" -f2 | tr ';' ' '`)

EDIT: (improved, nestable version as per Dennis)

n=($(grep -i ipaddress filename | cut -d"=" -f2 | tr ';' ' '))


A variation on a theme:

$ line=$(grep -i ipaddress /opt/ipfile)$ saveIFS="$IFS"    # always save it and put it back to be safe$ IFS="=;"$ n=($line)$ IFS="$saveIFS"$ echo ${n[0]}ipAddress$ echo ${n[1]}10.78.90.137$ echo ${n[2]}10.78.90.149

If the file has no other contents, you may not need the grep and you could read in the whole file.

$ saveIFS="$IFS"$ IFS="=;"$ n=$(</opt/ipfile)$ IFS="$saveIFS"