用bash爆炸文件

问题描述 投票:1回答:5

我正在尝试做的是在我的应用程序上的bash脚本中模拟一个2D数组。 (我是用bash写它的白痴,但是在我的截止日期之前我有一份工作副本,我会重写它)

我要读取的server.data文件:

1:hello:there
2:im:a
3:computing:system

我知道PHP ALOT比bash更好,但这里是我的意思的伪代码

foreach(line in server.data) {         
 arr = explode(":", server.data)  
  echo arr[0]    
  echo arr[1]  
  echo arr[2]  
  echo \n  
}

会返回这些值:

1 hello there
2 im a
3 computing system

有人可以编写一个小的bash脚本,解释如何将每一行放入数组中吗?

php linux bash explode
5个回答
5
投票
cat server.data | 
while read line; do  
   IFS=: 
   set - $line
   echo $1  
   echo $2  
   echo $3
done

3
投票

一个更一般的答案:如果你想在bash中模仿php的“爆炸”只有一个字符串(或来自文件的数据)你可以使用类似的东西:

#!/bin/bash
# explode functionality in bash

data="one:two:three:and 4"

echo $data | while read line; do
   IFS=:
   set - $line
   echo $1
   echo $2
   echo $3
   echo $4
done

如果您的数据另一方面来自文件,那么您可以将文件的内容重定向到while循环:

  #!/bin/bash
  # explode 

  filename="data"

  while read line; do
     IFS=:
     set - $line
     echo $1
     echo $2
     echo $3
     echo $4
  done < $filename

这个重定向比cat $filename更好地进入while循环,因为它不需要分叉另一个进程。


0
投票

假设文本文件名为“x.txt”:

#!/bin/bash

for line in `cat x.txt`; do
    a[${i}]=$line;
    i=$i+1;
done;

echo ${a[0]};
echo ${a[1]};
echo ${a[2]};

0
投票
while IFS=: read -a arr; do
    echo "${a[@]}"
    echo -n "${arr[0]} "
    echo -n "${arr[1]} "
    echo "${arr[2]}"
done < server.data

echo语句只是演示了访问数组的一些方法;所有的工作都是由read -a完成的。


0
投票

这为您提供了一个伪二维数组,您可以通过连接每个维度索引来访问各个元素:

while read line
do
    ((i++))
    j=0
    IFS=:
    for e in $line
    do
        ((j++))
        lines["$i$j"]=$e
    done
done < data.txt

echo ${lines[@]}
1 hello there 2 im a 3 computing system
echo ${lines[12]}
hello
© www.soinside.com 2019 - 2024. All rights reserved.