我正在尝试读取csv文件:
"EDP";"Picture 1";"Picture 2";"Picture 2"
"1001480210";"T244.png";"";""
我创建了一个脚本来读取此文件:
cd ~/86829/
while IFS=';' read "EDP" "Picture 1" "Picture 2" "Picture 3"
当我运行脚本时,我收到此错误:
./RUN_CopyPictures.sh: 9: read: Picture 1: bad variable name
当我将标题更改为"Picture1";"Picture2";"Picture2"
,并将脚本更改为while IFS=';' read EDP Picture1 Picture2 Picture3
这是工作
所以我的问题很清楚:
如何阅读包含白色的csv文件的标题?
问题不在于读取"标题"(通常只是CSV文件的第一行)。
相反,您的问题(导致错误)是一行read x
为名为x
的变量分配一个值(然后可以通过$x
引用该值)。
在您的示例中,您使用read "Picture 1"
有效地尝试为名为Picture 1
的变量赋值。 由于 bash 禁止带空格的变量名(就像任何其他非深奥的编程语言一样),这给了你一个错误。
解决方案是使用清晰合法的变量名称:
while IFS=';' read edp pic1 fusel y
do
echo "Picture 1 is ${pic1}"
echo "Picture 2 is ${fusel}"
echo "Picture 3 is ${y}"
done
变量名称有许多命名方案,常见的包括所有带有(或不带)下划线的小写字母来分隔单词,或CamelCase。
关于"标题">
您的脚本对您所称的"标题"一无所知。 CSV对"标题"也一无所知。 CSV只是一种同时具有行(行)和列的格式,而不是只有行的简单文本文件。 就像文本文件没有"标题"的概念一样,CSV文件也没有"标题"。 然而,流行的CSV导出软件可能会为CSV文件中的第一行赋予特殊含义,并(滥用)将其用于标题信息(因此内容只是一个标签,而实际的列内容可以有所不同)
在任何情况下,脚本的IFS=';' read ...
部分都不会对标题执行任何操作;如果输入数据,它只是从一行中提取多个字段,并将这些字段分配给变量。 这些变量的名称可以是完全任意的(只要它们符合变量名称的 bash 语法),并且不需要与文件的内容有任何关系。