Linux 如何将一行文件正确地读入数组?

Linux 如何将一行文件正确地读入数组?,linux,bash,scripting,curl,sed,Linux,Bash,Scripting,Curl,Sed,我有这样一个文件: 1234 1234 "First Name" "Last Name" function somePeoples() { body='"id":"'$1'","num":"'$2'","name":"'$3'","lname":"'$4'"' echo $body } input.txt: 1234 1234 "First Name" "Last Name" 2234 2234 "Some other name" "Some other last name" 我有

我有这样一个文件:

1234 1234 "First Name" "Last Name"
function somePeoples()
{
  body='"id":"'$1'","num":"'$2'","name":"'$3'","lname":"'$4'"'
  echo $body
}
input.txt:
1234 1234 "First Name" "Last Name"
2234 2234 "Some other name" "Some other last name"
我有一个bash函数,如下所示:

1234 1234 "First Name" "Last Name"
function somePeoples()
{
  body='"id":"'$1'","num":"'$2'","name":"'$3'","lname":"'$4'"'
  echo $body
}
input.txt:
1234 1234 "First Name" "Last Name"
2234 2234 "Some other name" "Some other last name"
它包含在一个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"
现在让我们回到包含以下行的文件:

1234 1234 "First Name" "Last Name"
function somePeoples()
{
  body='"id":"'$1'","num":"'$2'","name":"'$3'","lname":"'$4'"'
  echo $body
}
input.txt:
1234 1234 "First Name" "Last Name"
2234 2234 "Some other name" "Some other last name"
我试图通过一个有限计数的for循环读取文件中的每一行,因为我知道文件中有多少行。诀窍是读取每一行并将每一行放入一个数组中,以传递给SomePeople函数。因此,我制作了一个脚本,该脚本使用该函数源于另一个脚本。让我们称之为客户端脚本,并假设它实际上在循环:

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复制了这个问题。

这并没有真正解决为什么引用不起作用的问题(我假设您尝试了单引号),但是如果可以接受快速而肮脏的解决方案,您可以通过regexp将空格转换为其他内容,如果如您所说,原始数据文件是CSV格式的,那么您最好做一些简单的事情,例如

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

完成好,下面是我在将输入文件转换为csv后所做的:

ORIG_IFS=$IFS
IFS=$(echo -en ",")
arr=(`sed -ns "1p" input.txt`) # nvm the extension
IFS=$ORIG_IFS
somePeoples "${arr[@]}"
这将产生以下输出:

"id":"1234","num":"1234","name":""First Name"","lname":""Last Name""
引用的字符串被双引号引用。差不多了。也许我需要先清理输入文件

sed -e 's/"//g' < input.txt > input.txt.new
sed-e's///g'input.txt.new

然后这就是我用来最终得到我想要的输出的东西。谢谢大家:)直到现在我才知道IFS。

实际上我认为我犯了一个错误。原始输入文件是一个csv文件,每列都有引号。我将逗号改为空格,但我失败了。谢谢你们的建议。我认为空格不是正确的分隔符问题。没有理由使用
echo
来设置
IFS
,只需执行
IFS=,
IFS=,'