文件重定向常见于脚本需要读入文件和输出文件时。这个样例脚本两件事都做了。它读取.csv
格式的数据文件,输出SQL INSERT语句来将数据插入数据库。
shell脚本使用命令行参数指定待读取的.csv文件。.csv格式用于从电子表格中导出数据,所以
你可以把数据库数据放入电子表格中,把电子表格保存成.csv格式,读取文件,然后创建INSERT
语句将数据插入MySQL数据库。
脚本内容如下。
$cat test23
#!/bin/bash
# read file and create INSERT statements for MySQL
outfile='members.sql'
IFS=','
while read lname fname address city state zip
do
cat >> $outfile << EOF
INSERT INTO members (lname,fname,address,city,state,zip) VALUES
('$lname', '$fname', '$address', '$city', '$state', '$zip');
EOF
done
这个脚本很短小,这都要感谢有了文件重定向!脚本中出现了三处重定向操作。while循环使用read语句(参见第14章)从数据文件中读取文本。注意在done语句中出现的重定向符号:
done < ${1}
当运行程序test23时,$1代表第一个命令行参数。它指明了待读取数据的文件。read语句
会使用IFS字符解析读入的文本,我们在这里将IFS指定为逗号。
脚本中另外两处重定向操作出现在同一条语句中:
cat >> $outfile << EOF这条语句中包含一个输出追加重定向(双大于号)和一个输入追加重定向(双小于号)。输
出重定向将cat命令的输出追加到由$outfile变量指定的文件中。cat命令的输入不再取自标准
输入,而是被重定向到脚本中存储的数据。EOF符号标记了追加到文件中的数据的起止。
INSERT INTO members (lname,fname,address,city,state,zip) VALUES
('$lname', '$fname', '$address', '$city', '$state', '$zip');
上面的文本生成了一个标准的SQL INSERT语句。注意,其中的数据会由变量来替换,变量
中内容则是由read语句存入的。
所以基本上while循环一次读取一行数据,将这些值放入INSERT语句模板中,然后将结果
输出到输出文件中。
在这个例子中,使用以下输入数据文件。
$ cat members.csv
Blum,Richard,123 Main St.,Chicago,IL,60601
Blum,Barbara,123 Main St.,Chicago,IL,60601
Bresnahan,Christine,456 Oak Ave.,Columbus,OH,43201
Bresnahan,Timothy,456 Oak Ave.,Columbus,OH,43201
$
运行脚本时,显示器上不会出现任何输出:$ ./test23 < members.csv
$
但是在members.sql输出文件中,你会看到如下输出内容。
$ cat members.sql
INSERT INTO members (lname,fname,address,city,state,zip) VALUES ('Blum',
'Richard', '123 Main St.', 'Chicago', 'IL', '60601');
INSERT INTO members (lname,fname,address,city,state,zip) VALUES ('Blum',
'Barbara', '123 Main St.', 'Chicago', 'IL', '60601');
INSERT INTO members (lname,fname,address,city,state,zip) VALUES ('Bresnahan',
'Christine', '456 Oak Ave.', 'Columbus', 'OH', '43201');
INSERT INTO members (lname,fname,address,city,state,zip) VALUES ('Bresnahan',
'Timothy', '456 Oak Ave.', 'Columbus', 'OH', '43201');
$
结果和我们预想的一样!现在可以将members.sql文件导入MySQL数据表中了