我在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"
答案 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而不是