如何连接 Bash 脚本中的字符串以在 SQL 语句中使用?

如何连接 Bash 脚本中的字符串以在 SQL 语句中使用?

我想在 Bash 脚本中执行以下操作:

  1. 从带有文件名的文件中读取一些文件名
  2. 设置变量输入路径
  3. 连接 1. 和 2.
  4. 在 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,并且该文件肯定找不到。

解决方案

  1. 运行dos2unixallto468 文件来修复该问题一次,
  2. 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

相关内容