脚本正在运行,但不知道它被卡在哪里

时间:2015-05-24 06:32:32

标签: bash shell

这是我使用嵌套循环的脚本,但是当我尝试在内循环中打印值时,它不会打印任何内容。 它没有进入第一个循环。

你能解释一下出了什么问题吗?

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

3 个答案:

答案 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_idcl_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_idapp_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

此评论也适用于第一个awksedsed序列。

请注意cdarkecomment关于使用变量保存文件名的内容。如果您要多次提及文件名,请使用变量来保存它。这意味着您几乎总是拥有一个包含每个文件名的变量。