这个BASH代码可以在命令行上运行,但是当我将它移动到脚本中时却不行

时间:2013-09-26 16:32:13

标签: bash debugging shell

我在CLI上构建了一个kludgey脚本,我无法成功移动到文本文件中。 我知道它编写得很糟糕,但我有兴趣解决我遇到的问题,而不是重写它。我想理解为什么我编写得不好的代码在执行时会表现不同命令行与将其保存为文件时的比较。

我认为这与在脚本中过早插入内容有关,因为如果我将单行版本替换为同一文件(没有格式化),我得到相同的输出。请注意下面的调试行以及它不打印的方式。

脚本内容

#!/bin/bash

totalNodes=0             #initialize sum                                                                                     
echo -e "ID\t\t\tNODES"; #title line                                                                                         
for n2 in $(             #n2 will get populated with the number of nodes (to be added to totalNodes)                         
    for n in $(          #n is an intermediate string that munges the Resource_list.nodes line (kludgy)                      
        for i in $(
            qstat|grep " ef "|cut -f 1 -d ' ')     #i gets the ef queue lines                                                
        do
            echo "debug $i"
            j=$(echo $i|sed 's/(\d+)\..+/\$1/');    #j is the actual ID                                                      
            qstat -f | grep -A43 $j;               #extracts the full output from qstat for this job ID                      
        done|grep Resource_List.nodes)             #closes definition of n over loop                                         
    do echo ${n};done|grep ppn)                    #closes definition of n2 over loop                                        
do
   echo "$j ${n2:0:1}"                             #output line                                                              
   totalNodes=$(($totalNodes+${n2:0:1}))           #counting nodes                                                           
done
echo "$totalNodes nodes of 16 running in EF queue"

预期输出(我在命令行获得的内容):

ID          NODES
2378512.yaddayadday-adm 4
2378512.yaddayadday-adm 4
2378512.yaddayadday-adm 4
2378512.yaddayadday-adm 2
14 nodes of 16 running in EF queue
来自脚本的

当前输出

ID          NODES
 4
 4
 4
 2
14 nodes of 16 running in EF queue

所以我很困惑如何获得正确的总数(意味着$ n2正确定义)但我甚至无法在调试打印行(第8行)上打印$ i。

供参考,这是单线。就像我说的那样,这给出了上面显示的“EXPECTED OUTPUT”,当在命令行上执行时,但是当我将其保存为没有其他格式的文件时,输出与上面的代码块“CONTENTS OF SCRIPT”相同。 /强>

totalNodes=0;echo -e "ID\t\t\tNODES";for n2 in $(for n in $(for i in $(qstat|grep " ef "|cut -f 1 -d ' ');do j=$(echo $i|sed 's/(\d+)\..+/$1/');qstat -f | grep -A43 $j;done|grep Resource_List.nodes);do echo ${n};done|grep ppn);do echo "$j ${n2:0:1}";totalNodes=$(($totalNodes+${n2:0:1})); done;echo "$totalNodes nodes of 16 running in EF queue"

2 个答案:

答案 0 :(得分:4)

命令替换方法$()在子shell中运行命令,因此如果在其中定义变量,该变量的值将在外部丢失。

j=1
: "$(j=2)"
echo "$j" # => 1

答案 1 :(得分:0)

几个错误:

1- qstat | grep“ef”| cut -f 1 -d''返回一个空列表

2- qstat -f | grep -A43 $ j返回空列表

在运行循环之前

确保#1和#2生成有效列表

因为qstat | grep“ef”| cut -f 1 -d''是常量,考虑将它移到循环之外

    $ x1 = $(qstat | grep“ef”| cut -f 1 -d'')

使用$ x1而不是