Content #
$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 < ${1}
$
脚本中出现了3处重定向操作。while循环使用read语句从数据文件中读取文本。注意在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’); $
From #
Linux命令行与shell脚本编程大全