将输出重定向到bash数组

时间:2009-11-18 02:58:43

标签: bash shell redirect

我有一个包含字符串

的文件
ipAddress=10.78.90.137;10.78.90.149

我想将这两个IP地址放在一个bash数组中。为此,我尝试了以下方法:

n=$(grep -i ipaddress /opt/ipfile |  cut -d'=' -f2 | tr ';' ' ')

这导致提取值正常但由于某种原因,数组的大小返回为1,我注意到这两个值都被标识为数组中的第一个元素。那是

echo ${n[0]}

返回

10.78.90.137 10.78.90.149

我该如何解决这个问题?

感谢您的帮助!

5 个答案:

答案 0 :(得分:20)

你真的需要一个数组

吗?

的bash

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

如果你想放入数组

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

@OP,关于你的方法:将你的IFS设置为空格

$ 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

此外,不需要使用这么多工具。你可以使用awk,或者简单地使用bash shell

#!/bin/bash
declare -a arr
while IFS="=" read -r caption addresses
do
 case "$caption" in 
    ipAddress*)
        addresses=${addresses//[\"]/}
        arr=( ${arr[@]} ${addresses//;/ } )
 esac
done < "file"
echo ${arr[@]}

输出

$ more file
foo
bar
ipAddress="10.78.91.138;10.78.90.150;10.77.1.101"
foo1
ipAddress="10.78.90.137;10.78.90.149"
bar1

$./shell.sh
10.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

答案 1 :(得分:7)

这个有效:

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

编辑:(根据丹尼斯的改进,可嵌套版本)

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

答案 2 :(得分:1)

主题的变体:

$ 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

如果文件中没有其他内容,则可能不需要grep,您可以读取整个文件。

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

答案 3 :(得分:1)

Perl解决方案:

n=($(perl -ne 's/ipAddress=(.*);/$1 / && print' filename))

在一次操作中测试并删除不需要的字符。

答案 4 :(得分:0)

您可以使用IFS中的bash来完成此操作。

  • 首先从文件中读取第一行。
  • Seoncd将其转换为=作为分隔符的数组。
  • 第三次将值转换为以;作为分隔符的数组。

多数民众赞成!

#!/bin/bash
IFS='\n' read -r lstr < "a.txt"
IFS='=' read -r -a lstr_arr <<< $lstr
IFS=';' read -r -a ip_arr <<< ${lstr_arr[1]}
echo ${ip_arr[0]}
echo ${ip_arr[1]}