我想在 Bash 脚本中执行以下操作:
- 从带有文件名的文件中读取一些文件名
- 设置变量输入路径
- 连接 1. 和 2.
- 在 SQL 语句中使用 3.
这是我的代码:
#!/bin/bash
INPath="/home/bono/RD/BV-OUT/"
while
read line
do
RD="$line"
RDFile="$INPath$RD"
echo -e $RDFile
###MYSQLs:
mysql -u root -D RD --local-infile << EOF
LOAD DATA LOCAL INFILE '$RDFile'
INTO TABLE bv_tmp_all FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n';
EOF
##### EOSQL
done < /home/bono/RD/BV-OUT/allto468
echo 显示正确的路径和文件名,但 mysql 总是说:
not found (Errcode: 2 - File or Directory not found)
我尝试过不同的方法来连接这两个字符串,但都没有效果:(
以下代码适用于 mysql(无需连接),但这不是我需要的:
#!/bin/bash
while
read line
do
RDFile="/home/bono/RD/BV-OUT/468-R11"
echo -e $RDFile
###MYSQLs:
mysql -u root -D RD --local-infile << EOF
LOAD DATA LOCAL INFILE '$RDFile'
INTO TABLE bv_tmp_all FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n';
EOF
##### EOSQL
done < /home/bono/RD/BV-OUT/allto468
连接有什么问题?
答案1
似乎RDFile
您的第一个脚本中不存在。 中有什么/home/bono/RD/BV-OUT/allto468
? 它们是 中真正存在的文件名吗/home/bono/RD/BV-OUT/
?
我会在中间添加一个测试来检查构造的路径是否真的存在,例如这样:
#!/bin/bash
INPath="/home/bono/RD/BV-OUT/"
while read line; do
RD="$line"
RDFile="$INPath$RD"
echo $RDFile
if ! test -f "$RDFile"; then
echo error: file does not exist: $RDFile
continue
fi
###MYSQLs:
mysql -u root -D RD --local-infile << EOF
LOAD DATA LOCAL INFILE '$RDFile'
INTO TABLE bv_tmp_all FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n';
EOF
##### EOSQL
done < /home/bono/RD/BV-OUT/allto468
答案2
如果allto468
本身有 \r\n 行结尾,那么 $line 将看起来像468-R11\r
,并且该文件肯定找不到。
解决方案
- 运行
dos2unix
allto468 文件来修复该问题一次, done
将行改为done < <(sed 's/\r$//' /home/bono/RD/BV-OUT/allto468)
答案3
在我看来,这似乎是引用问题。要使变量替换起作用,请使用“”而不是“”,即替换:
mysql -u root -D RD --local-infile << EOF
LOAD DATA LOCAL INFILE '$RDFile'
INTO TABLE bv_tmp_all FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n';
EOF
和:
mysql -u root -D RD --local-infile << EOF
LOAD DATA LOCAL INFILE "$RDFile"
INTO TABLE bv_tmp_all FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n';
EOF
要检查文件名中是否有奇怪的字符,echo "$RDFile" | od -bc
。