BASH读取txt文件并存储在数组中

BASH读取txt文件并存储在数组中

我正在编写我的第一个 BASH 脚本,我对 c 和 c# 有一些经验,所以我认为程序的逻辑是正确的..只是语法太复杂了,因为显然有数十亿种方法可以编写相同的东西!

无论如何,这是脚本:它只是检查参数(字符串)是否包含在某个文件中。如果是这样,它将文件的每一行存储在一个数组中,并将该数组的一项写入文件中。我确信一定有更简单的方法来实现这一点,但我想用 bash 循环做一些练习

    #!/bin/bash

NOME=$1
c=0


#IF NAME IS FOUND IN THE PHONEBOOK THANK STORE EACH LINE OF THE FILE INTO ARRAY
#ONCE THE ARRAY IS DONE GET THE INDEX OF MATCHING NAME AND RETURN ARRAY[INDEX+1]

if grep  "$NOME" /root/phonebook.txt ; then
        echo "CREATING ARRAY"
        while read line
        do
                myArray[$c]=$line # store line
                c=$(expr $c + 1) # increase counter by 1
        done < /root/phonebook.txt

else
        echo "Name not found"
fi

c=0
for i in myArray;
        do
              if   myArray[$i]="$NOME" ;  then
                 echo ${myArray[i+1]} >> /root/numbertocall.txt
              fi

done

这段代码确实只返回 myArray 的第二项(myArray[2]或文件的第二行)..为什么?

答案1

IFS=$'\n' a=($(cat phonebook.txt))
for i in $(seq ${#a[*]}); do
    [[ ${a[$i-1]} = $name ]] && echo "${a[$i]}"
done

在 Bash 4 中IFS=$'\n' a=($(cat phonebook.txt))可以替换为mapfile -t a < phonebook.txt.

grep -A1 在匹配后打印一行。 -x 禁用像 -F 一样的正则表达式,但它只匹配完整的行。

grep -x "$name" -A1 phonebook.txt | tail -n1

答案2

index=0
while read line; do
  myArray[index]="$line"
done < inputfile

较新版本的 bash 支持关联数组。这会让事情变得更容易:

declare -A myArray
while read name; do
  read number
  myArray[name]="$number"
done < inputfile

echo ${myArray[name]}

答案3

在一个题为“BASH读取txt文件并存储在数组中“我觉得readarray值得一提。我用来将测试文件读入数组的方法的一个示例是:

readarray -t arrayIPblacklist < /etc/postfix/IP-black-list.txt

前面的代码将一个由换行符分隔的 IP 地址文件加载到名为“的数组中”数组IP黑名单“。适用于您的电话簿文件。readarray是在 bash 4 中引入的,因此此方法不适用于运行早期 bash 版本的旧主机。

-t选项会从每个元素中删除换行符,因为大多数时候您不希望包含它们。

$ seq 3 | bash -c 'readarray a; printf "<%q>\n" "${a[@]}"'
<$'1\n'>
<$'2\n'>
<$'3\n'>
$ seq 3 | bash -c 'readarray -t a; printf "<%q>\n" "${a[@]}"'
<1>
<2>
<3>

相关内容