我有以下内容:
if [[ "${outfile}" == '/dev/stdout' ]]; then
"${mysql_cmd[@]}" <"${infile}" >"${outfile}"
else
"${mysql_cmd[@]}" <"${infile}" |
sed -e 's|[[:<:]]NULL[[:>:]]|\\N|g' >"${outfile}"
fi
sed
旨在将NULL
转换为\N
,以便输出可以与LOAD DATA LOCAL INFILE
一起使用。
我想把它做成类似于这样的一句台词:
"${mysql_cmd[@]}" <"${infile}" | "${transformer_cmd[@]}" >"${outfile}"
当
transformer_cmd
是“空对象”(即不是 sed
命令)时,mysql
必须继续交互(这样会打开一个 mysql
shell,可以在其中输入 SQL 语句)。我已经尝试将 cat
作为 transformer_cmd
,但未满足此要求。
这可能吗?如果是的话,怎么办?
我宁愿避免做像
"${mysql_cmd[@]}" <"${infile}" "${transformer_cmd}" >"${outfile}"
这样的事情,这样transformer_cmd
包括|
,但如果没有其他方法,我会这样做。
附录:
transformer_cmd
包括|
不起作用,因为由于某种原因${transformer_cmd}
(不带双引号)仍然被解释为mysql
的参数。
我无法找到合适的
transformer_cmd
,但是根据@chepner给出的提示,我能够想出以下内容:
mysql_cmd "${mysql_options[@]}"
其中
mysql_cmd
默认为:
function mysql_cmd() {
mysql "$@"
}
如果为脚本提供了一个选项,则将被覆盖为:
function mysql_cmd() {
mysql "$@" |
sed -e 's|\\\\|\\|g' |
tee "${outfile}"
}