1

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

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

剧本内容

#!/bin/bash

totalNodes=0 #初始化总和                                                                                     
echo -e "ID\t\t\tNODES"; #标题行                                                                                         
for n2 in $( #n2 将填充节点数(将添加到totalNodes)                         
    for n in $( #n 是一个中间字符串,用于处理 Resource_list.nodes 行 (kludgy)                      
        对于我在 $(
            qstat|grep " ef "|cut -f 1 -d ' ') #i 获取ef队列行                                                
        做
            回声“调试$ i”
            j=$(echo $i|sed 's/(\d+)\..+/\$1/'); #j 是实际ID                                                      
            qstat -f | grep -A43 $j; #从 qstat 中提取此作业 ID 的完整输出                      
        done|grep Resource_List.nodes) #关闭 n 循环的定义                                         
    do echo ${n};done|grep ppn) #关闭n2 over loop的定义                                        
做
   echo "$j ${n2:0:1}" #输出行                                                              
   totalNodes=$(($totalNodes+${n2:0:1})) #计数节点                                                           
完毕
echo "EF 队列中运行的 16 个 $totalNodes 节点"

预期输出(我在命令行得到的):

标识节点
2378512.yadddayadday-adm 4
2378512.yadddayadday-adm 4
2378512.yadddayadday-adm 4
2378512.yadddayadday-adm 2
EF 队列中运行的 16 个节点中的 14 个节点

脚本的当前输出

标识节点
 4
 4
 4
 2
EF 队列中运行的 16 个节点中的 14 个节点

所以我很困惑如何获得正确的总数(意味着 $n2 被正确定义)但我什至无法在 debug-with-print 行(第 8 行)打印 $i。

作为参考,这里是单线。就像我说的,当我在命令行上执行时,这给出了上面显示的“预期输出”,但是当我将它保存为没有额外格式的文件时,输出与上面的代码块“脚本内容”相同。

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);做回声 ${n} ;done|grep ppn);回显 "$j ${n2:0:1}";totalNodes=$(($totalNodes+${n2:0:1})); done;echo "EF 队列中运行的 16 个 $totalNodes 节点"
4

2 回答 2

4

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

j=1
: "$(j=2)"
echo "$j" # => 1
于 2013-09-26T17:12:11.033 回答
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 而不是上面

于 2013-09-30T23:11:34.910 回答