我正在检查用于读取CSV文件然后将数据插入数据库的shell脚本。
该脚本的结构类似于
#!/bin/bash
FILENAME='MyFile.csv'
OLDIFS=$IFS
IFS=,
LINE=0
while read foo bar baz boo
do
LINE=$(($LINE+1));
if [ $LINE != 1 ]
then
if [ -z "$bar" ]
then
bar=-1
fi
if [ -z "$baz" ]
then
baz=-1
fi
if [ -z "$boo" ]
then
boo='NULL'
fi
fi
done <$FILENAME
IFS=$OLDIFS
如果我的CSV文件具有结构
foo, bar, baz, boo, zee, wee
1, 2, 3, 4, 5, 6
7, 8, 9, 10, 11, 12
read
如何对最近两列中的不读取做出反应?我假设数据被忽略,在循环的每次迭代中,只有前四列被读入变量?
我也找不到-z
语句中if fi
的任何信息,我认为它代表&#34;如果值等于零&#34;?
答案 0 :(得分:3)
来自Bash Manual(强调我的):
从标准输入读取一行,或从作为
-u
选项的参数提供的文件描述符 fd 中读取,并将第一个单词分配给第一个名称,第二个单词指向第二个名称,依此类推,剩余单词及其插入的分隔符分配给最后一个名称。强>
因此,在您的情况下,boo
将包含每行的剩余数据。
-z
测试也在Bash Conditional Expressions下的Bash手册中进行了描述。简而言之:
如果 string 的长度为零,则为真。
答案 1 :(得分:2)
read
不会忽略最后两列;它只是提前停止分裂。如果您检查boo
的值,则会看到它包含boo, zee, wee
之类的值作为其值。你至少还需要一个变量来保持尾随:
while IFS=, read foo bar baz boo everythingelse; do
...
done < "$FILENAME"
-z
测试字符串参数的长度。要测试零值,您需要使用=
(或-eq
,如果您知道该字符串看起来像一个整数。)
if [ "$bar" -eq 0 ]; then
bar=-1
fi
请注意,逗号后面的空格不从变量值中删除。第一行bar
的值为<space>2
,而不是2
。