1

我想要做的是在我的应用程序的 bash 脚本中模拟一个二维数组。(我是一个用 bash 编写它的白痴,但是一旦我在截止日期之前有一个工作副本,我就会重新编写它)

我想从中读取的 server.data 文件:

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

我比 bash 更了解 PHP,但这是我的意思的伪代码

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 脚本,解释如何将每一行放入一个数组中吗?

4

5 回答 5

5
cat server.data | 
while read line; do  
   IFS=: 
   set - $line
   echo $1  
   echo $2  
   echo $3
done
于 2012-07-29T14:47:36.897 回答
4

一个更一般的答案:如果你想在 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 循环要好,因为它不需要派生另一个进程。

于 2017-12-29T14:15:12.217 回答
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]};
于 2012-07-29T14:56:47.193 回答
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.

于 2012-07-29T15:01:47.243 回答
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
于 2012-07-29T15:08:49.940 回答