这是我的shell脚本,它运行正常,没有任何错误。但我希望以不同的方式获得输出。
#!/bin/bash
DB_USER='root'
DB_PASSWD='123456'
DB_NAME='job'
Table_Name='status_table'
#sql=select job_name, date,status from $DB_NAME.$Table_Name where job_name='$f1' and date=CURDATE()
file="/root/jobs.txt"
while read -r f1
do
mysql -N -u$DB_USER -p$DB_PASSWD <<EOF
select job_name, date,status from $DB_NAME.$Table_Name where job_name='$f1' and date=CURDATE()
EOF
done <"$file"
mysql> select * from job.status_table
+---------+----------+------------+-----------+
| Job_id | Job Name | date | status |
+---------+----------+--------+---------------+
| 111 | AA | 2016-12-01 | completed |
| 112 | BB | 2016-12-01 | completed |
| 113 | CC | 2016-12-02 | completed |
| 112 | BB | 2016-12-01 | completed |
| 114 | DD | 2016-12-02 | completed |
| 201 | X | 2016-12-03 | completed |
| 202 | y | 2016-12-04 | completed |
| 203 | z | 2016-12-03 | completed |
| 111 | A | 2016-12-04 | completed |
+---------+----------+------------+-----------+
[rteja@server0 ~]# more jobs.txt
AA
BB
CC
DD
X
Y
Z
A
ABC
XYZ
(mysql -N -u$DB_USER -p$DB_PASSWD <<EOF)
[rteja@server0 ~]# ./script.sh
AA 2016-12-01 completed
BB 2016-12-01 completed
(mysql -u$DB_USER -p$DB_PASSWD <<EOF)
[rteja@server0 ~]# ./script.sh
job_name date status
AA 2016-12-01 completed
job_name date status
BB 2016-12-01 completed
挑战:
1。只想在输出中打印一次列名,并将结果存储在CSV文件中。
2。我不想公开密码&amp;代码中的用户名给大家。有没有办法隐藏,就像我听说我们可以创建环境变量并在脚本中调用它。我们可以设置环境变量文件的权限,以防止每个人访问它,只有我们应该能够访问它。
答案 0 :(得分:1)
您可以多次运行单个查询,而不是多次执行选择查询:
job_name in ('AA','BB','CC'...)
为此,首先使用mapfile
读取数组中的完整文件:
mapfile -t arr < jobs.txt
然后将数组值格式化为适合IN
运算符的值列表:
printf -v cols "'%s'," "${arr[@]}"
cols="(${cols%,})"
显示您的值:
echo "$cols"
('AA','BB','CC','DD','X','Y','Z','A','ABC','XYZ')
最后将您的SQL查询运行为:
mysql -N -u$DB_USER -p$DB_PASSWD <<EOF
select job_name, date,status from $DB_NAME.$Table_Name
where job_name IN "$cols" and date=CURDATE();
EOF
安全地连接到MySQL use login-paths (.mylogin.cnf
)
根据MySQL手册:
指定服务器连接信息的最佳方法是使用
.mylogin.cnf
文件。此文件不仅已加密,而且实用程序执行的任何记录都不会公开连接信息。