这是我使用嵌套循环的脚本,但是当我尝试在内循环中打印值时,它不会打印任何内容。 它没有进入第一个循环。
你能解释一下出了什么问题吗?
CURR_DIR=`dirname $0`
SCRIPT_DIR=`pwd`
echo "Current Directory: $CURR_DIR"
source ${CURR_DIR}/db.conf
mysql --batch --raw -u $DB_USER -p$DB_PASS -h $DB_HOST $MYDB \
-e'SELECT dc_id,dc_name from `dc_mast`' |
awk '{print $1 "," $2 "\n"}'>${CURR_DIR}/datac.txt
sed -i -e "1d" ${CURR_DIR}/datac.txt
sed -i -e '/^$/d' ${CURR_DIR}/datac.txt
echo "outer first loop"
while IFS="," read dc_id dc_name
do
echo ${dc_id}
echo "inner first loop" ${dc_id}
mysql --batch --raw -u $DB_USER -p$DB_PASS -h $DB_HOST $MYDB \
-e'SELECT distinct c.cl_id as cl_id,c.cl_dns as cl_dns
FROM cso_crm.cluster_mast c
JOIN cso_crm.env_detail e on e.cl_id=c.cl_id
JOIN cso_crm.env_mast m on m.env_id=e.env_id
WHERE m.dc_id='${dc_id}' and m.service_id='1' and e.app_id='2'' |
awk '{print $1 "," $2 "\n"}' > ${CURR_DIR}/cl.txt
sed -i -e "1d" ${CURR_DIR}/c1.txt
sed -i -e '/^$/d' ${CURR_DIR}/c1.txt
while IFS="," read cl_id cl_dns
do
echo "inner second loop" ${cl_id}
mysql --batch --raw -u $DB_USER -p$DB_PASS -h $DB_HOST $MYDB \
-e'select c.cust_name as customer
from cluster_mast m
join env_detail d on m.cl_id =d.cl_id
join env_mast e on d.env_id = e.env_id
join cust_mast c on e.cust_id = c.cust_id
where m.cl_id='${cl_id}' and e.status=1' |
awk '{print $1 "\n"}'> ${CURR_DIR}/cname.txt
sed -i -e "1d" ${CURR_DIR}/c1.txt
sed -i -e '/^$/d' ${CURR_DIR}/c1.txt
while IFS="," read customer
do
echo "https://"${cl_dns}"/"${cust_name} $'\n' > ${CURR_DIR}/xxx_url.txt
done
rm cname.txt
done
rm c1.txt
done
答案 0 :(得分:3)
尝试添加:
set -o xtrace
作为您计划的第一行。然后Bash将在执行时回显每个命令。
答案 1 :(得分:2)
在#!/bin/bash
之后的脚本中添加:
export 'PS4=\e[1;34m+ ${FUNCNAME:-main}@\e[1;36m${BASH_SOURCE}: \e[0;32m${LINENO}-> \e[0m'
它将显示更详细的调试信息。
然后你只需要运行:
bash -x <my_script>.sh
答案 2 :(得分:0)
您的循环卡在read
等待您输入内容(显然是cl_id
和cl_dns
)。
您没有为循环提供I / O重定向。您可能需要在< ${CURR_DIR}/c1.txt
之后添加done
,以便为read
提供输入。
请注意,mysql
脚本中的引号并不符合您的想法。你有(为了便于阅读而重新格式化):
mysql --batch --raw -u $DB_USER -p$DB_PASS -h $DB_HOST $MYDB \
-e'SELECT distinct c.cl_id as cl_id,c.cl_dns as cl_dns
FROM cso_crm.cluster_mast c
JOIN cso_crm.env_detail e on e.cl_id=c.cl_id
JOIN cso_crm.env_mast m on m.env_id=e.env_id
WHERE m.dc_id='${dc_id}' and m.service_id='1' and e.app_id='2'' |
整个表达式用单引号括起来,所以“#”中间的单引号括起来。简单地抑制单引号。 mysql
命令没有看到任何单引号。它等同于写作:
mysql --batch --raw -u $DB_USER -p$DB_PASS -h $DB_HOST $MYDB \
-e'SELECT distinct c.cl_id as cl_id,c.cl_dns as cl_dns
FROM cso_crm.cluster_mast c
JOIN cso_crm.env_detail e on e.cl_id=c.cl_id
JOIN cso_crm.env_mast m on m.env_id=e.env_id
WHERE m.dc_id='${dc_id}' and m.service_id=1 and e.app_id=2' |
如果service_id
和app_id
需要进行字符串比较,则可能需要:
mysql --batch --raw -u $DB_USER -p$DB_PASS -h $DB_HOST $MYDB \
-e"SELECT distinct c.cl_id as cl_id,c.cl_dns as cl_dns
FROM cso_crm.cluster_mast c
JOIN cso_crm.env_detail e on e.cl_id=c.cl_id
JOIN cso_crm.env_mast m on m.env_id=e.env_id
WHERE m.dc_id=${dc_id} and m.service_id='1' and e.app_id='2'" |
在整个陈述中使用双引号。如果dc_id
也应该是字符串,则可以在其周围添加单引号(此时mysql
将看到单引号)。
在你的外圈中,你有:
awk '{print $1 "\n"}' >${CURR_DIR}/cname.txt
sed -i -e "1d" ${CURR_DIR}/c1.txt
sed -i -e '/^$/d' ${CURR_DIR}/c1.txt
您在进入循环之前编辑了c1.txt
;再次编辑它似乎很愚蠢。您可能打算写c1.txt
。
此外,sed
可以在一次运行中进行多次修改:
sed -i -e "1d" -e '/^$/d' ${CURR_DIR}/cname.txt
您可以将awk
的输出放到sed
:
awk '{print $1 "\n"}' |
sed -e "1d" -e '/^$/d' > ${CURR_DIR}/cname.txt
但您可以awk
首先进行所有编辑:
awk 'NR==1{next} /^$/{next} {print $1 "\n"}' > ${CURR_DIR}/cname.txt
此评论也适用于第一个awk
,sed
,sed
序列。
请注意cdarke中comment关于使用变量保存文件名的内容。如果您要多次提及文件名,请使用变量来保存它。这意味着您几乎总是拥有一个包含每个文件名的变量。