gpt4 book ai didi

linux - Bash读取txt文件并存储在数组中

转载 作者:IT王子 更新时间:2023-10-29 01:23:36 26 4
gpt4 key购买 nike

我正在编写我的第一个 Bash 脚本,我对 C 和 C# 有一些经验,所以我认为程序的逻辑是正确的,只是语法太复杂了,因为显然有许多不同的方法可以编写相同的东西!

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

#!/bin/bash

NOME=$1
c=0

#IF NAME IS FOUND IN THE PHONEBOOK THEN 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])或者文件的第二行,为什么?

最佳答案

第一部分(构建数组的地方)看起来不错,但第二部分有几个严重的错误:

  • for i in myArray; -- 这将执行循环一次,$i 设置为“myArray”。在这种情况下,您希望 $i 遍历 myArray 的索引,因此您需要使用

    for i in "${!myArray[@]}"

    for ((i=0; i<${#a[@]}; i++))

    (虽然我通常更喜欢第一个,因为它适用于非连续和关联数组)。

    此外,您不需要 ; 除非 do 在同一行(在 shell 中,; 大部分等同于换行符,所以在行尾有一个分号是多余的)。

  • if myArray[$i]="$NOME"; then -- if 语句采用命令,因此会将 myArray[$i]="$NOME" 视为赋值命令,这不是完全是你想要的。为了比较字符串,您可以使用 test 命令或其同义词 [

    if [ "${myArray[i]}" = "$NOME" ]; then

    或 bash 条件表达式

    if [[ "${myArray[i]}" = "$NOME" ]]; then

    两者非常相似,但条件表达式的语法更清晰(例如,在测试命令中,> 重定向输出,而 \> 是字符串比较;在 [[ ]] 中,一个普通的 > 是一个比较)。

    无论哪种情况,您都需要为 myArray 使用适当的 $ 表达式,否则它将被解释为文字。另一方面,您不需要在“${myArray[i]}”中的i 之前需要$,因为它在数值表达式上下文,因此会自动展开。

    最后,请注意元素之间的空格是绝对必需的——在 shell 中,空格是非常重要的分隔符,而不是像在 c 中通常那样只是为了可读性。

关于linux - Bash读取txt文件并存储在数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15773507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com