我从以前的管理员那里继承了这个 bash 脚本,它从 CSV 文件获取输入。我正在修改它以将输出和错误消息输出到文本文件。但是,我得到的输出文件仅包含空行。想请问是否有人知道为什么会出现这种情况。预先感谢您的帮助。
#!/bin/bash
while read line; do
configname=$(echo "$line" | cut -d, -f1)
servicename=$(echo "$line" | cut -d, -f2)
oldcommand=$(echo "$line" | cut -d, -f3)
newcommand=$(echo "$line" | cut -d, -f4)
part1=$(echo -e "SELECT config_name,service_description,check_command FROM tbl_service")
part2=$(echo -e "WHERE config_name='$configname' and check_command='$newcommand' and service_description='$servicename'")
sqlquery=$(echo -e "$part1 $part2")
echo "$sqlquery"
output=$(echo "$sqlquery;" | mysql --host=localhost --user=sqluser --password='sqlpwd' sqldb1)
echo "$output" > Output.log 2> Error.log
done < "$1"
我不确定这个脚本有什么问题以及为什么它输出空行。
正如约翰提到的,这个脚本有几个问题。我认为最大的问题是 mysql 命令的错误输出不会显示在“Error.log”文件中,因为错误输出不是从 mysql 命令本身捕获的。我建议不要将“output”变量设置为 mysql 命令的输出,而是执行以下操作:
echo "$sqlquery;" | mysql --host=localhost --user=sqluser --password='sqlpwd' sqldb1 >> Output.log 2>> Error.log
注意,我还将它附加到文件中,而不是每次运行时截断它们。这很重要,因为 mysql 的调用是在一个循环中,因此这两个文件中唯一可能的内容是来自最后一次运行,而不是来自所有运行。
说了这么多,这是脚本的替代方案:
#!/bin/bash
while read line; do
configname=$(echo "$line" | cut -d, -f1)
servicename=$(echo "$line" | cut -d, -f2)
# oldcommand=$(echo "$line" | cut -d, -f3) # Never used.
newcommand=$(echo "$line" | cut -d, -f4)
sqlquery="SELECT config_name,service_description,check_command FROM tbl_service WHERE config_name='$configname' and check_command='$newcommand' and service_description='$servicename'"
echo "$sqlquery" # Not really sure the purpose of this line.
echo "$sqlquery" >> Output.log
echo "$sqlquery;" | mysql --host=localhost --user=sqluser --password='sqlpwd' sqldb1 >> Output.log 2>> Error.log
done < "$1"
请注意,我将所有
variable=$(echo -e "some string with other variables")
更改为 variable="some string with another variables"
。 -e 选项确实会导致“echo”解释某些字符序列以输出控制字符,但我不知道这里将如何使用其中任何一个,所以我摆脱了它们。
您可能还会注意到,我添加了一个
echo "$sqlquery" >> Output.log
,因为我不知道将该字符串输出到标准输出有什么好处,而且我可以看到将其添加到文件中,这样您就可以知道每次运行何时开始。显然,如果不需要,请随意将其取出。