linux - 如何正确地将文件的一行读入数组?

标签 linux bash scripting curl sed

我有这样一个文件:

1234 1234 "First Name" "Last Name"

我有一个像这样的 bash 函数:

function somePeoples()
{
  body='"id":"'$1'","num":"'$2'","name":"'$3'","lname":"'$4'"'
  echo $body
}

它包含在我将在命令行中获取的 bash 脚本中。之后,我执行以下操作来测试该功能:

$ arr=(1234 1234 "First Name" "Last Name")
$ somePeoples "{arr[@]}"
$ "id":"1234","num":"1234","name":"First Name","lname":"Last Name"
$ somePeoples "${arr[0]}" "${arr[1]}" "${arr[2]}" "${arr[3]}"
$ "id":"1234","num":"1234","name":"First Name","lname":"Last Name"

现在让我们回到包含如下行的文件:

input.txt:
1234 1234 "First Name" "Last Name"
2234 2234 "Some other name" "Some other last name"

我尝试通过有限计数的 for 循环读取文件中的每一行,因为我确切地知道文件中有多少行。诀窍是读取每一行并将每一行放入一个数组中以传递给 somePeoples 函数。所以我制作了一个脚本,该脚本使用该函数来获取另一个脚本。让我们将其称为客户端脚本,并假装它实际上在循环:

the client script:
arr=(`sed -n "1p" input.txt`)
somePeoples "${arr[@]}"

但令我恐惧的是输出是:

$ "id":"1234","num":"1234","name":""First,"lname":"Name""

此外,尝试执行这些操作会产生相同的结果

somePeoples "${arr[0]}" "${arr[1]}" "${arr[2]}" "${arr[3]}"
somePeoples `sed -n "1p" input.txt`

有什么区别?当我使用相同的引号模式在命令行中键入它时,它工作正常,但当我从文件中读取输入并将其传递给某个数组或直接传递给函数时却不行。为什么即使引用了参数它也会在空格处中断?而且,呃,我怎样才能防止这种情况发生?

我实际上正在尝试准备一个请求正文以 jSON 格式传递给 cURL,并且输入参数包含在一个数百行长的文件中。但我认为 cURL 的东西与这个问题无关,因为我仅通过 bash 重现了这个问题。

最佳答案

如果像您所说的那样,原始数据文件是 CSV 格式,那么您最好做一些简单的事情,例如

IFS=, while read id num name lname; do
    ...
done <input.txt

关于linux - 如何正确地将文件的一行读入数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4238910/

相关文章:

macos - 在 bash 脚本中重试命令行直到成功,然后继续脚本

r - 在 linux 上用 R 绘制图形时代码困惑

Linux 信号和中断处理程序

c++ - 在具有低级别访问权限的随身碟上写入

linux - Chef 从命令行管理报告

linux - 在 while 循环条件中设置变量

linux - bash 中的简单正则表达式解析

linux - 监控/dev/null 2>&1

bash - 用于自动化 SonicWall 防火墙 SSH session 的 Shell 脚本不起作用

bash - 用 Unix 文件中的另一个列表替换字符串列表的有效方法是什么?