我想得到一些数字,并将结果分配给一个自定义字符串我想得到数字,我可以在这个脚本的下一部分中使用它
这个script的名称是calQue.sh。它的内容类似于:
#!/bin/bash
lsfDir=/opt/ibm/lsf/10.1/linux3.10-glibc2.17-x86_64/bin
Queue="ser short medium large"
for i in $Queue
do
queName=`echo $i"idleNum"`
$queName"idleNum"=`$lsfDir/bhosts hg_$i | grep ok | awk '{if($5==0) print $0}' | wc -l`
done
echo $seridleNum
我运行了它,
sh calQue.sh
这是错误的。我得到的结果是:
calQue.sh: line 14: seridleNumidleNum=1: command not found
calQue.sh: line 14: shortidleNumidleNum=7: command not found
calQue.sh: line 14: mediumidleNumidleNum=37: command not found
calQue.sh: line 14: largeidleNumidleNum=4: command not found
所以我尝试了其他方法,比如:
for i in $Queue
do
queName=`echo $i`
idleNum=`$lsfDir/bhosts hg_$i | grep ok | awk '{if($5==0) print $0}' | wc -l`
#`echo $i`Num=$idleNum //it is wrong
#$queName=$idleNum //it is wrong
完成
和
Queue="ser short medium large"
for i in $Queue
do
queName=`echo $i`
"$i"idleNum=`$lsfDir/bhosts hg_$i | grep ok | awk '{if($5==0) print $0}' | wc -l`
echo $"$i"idleNum //it is wrong
done
如何获得正确的结果,例如:
字符串seridleNumidleNum应等于1;
我发现当字符串没有变量$I 时是正确的
idleNum=`$lsfDir/bhosts hg_$i | grep ok | awk '{if($5==0) print $0}' | wc -l`
echo $idleNum
如果我理解正确,您希望将结果存储到一个名称为字符串值的变量中,例如seridleNumidleNum。默认情况下,shell将执行该命令,这肯定会导致未找到的问题。正确的方法是将其放入eval
命令
eval $queName"idleNum"=`$lsfDir/bhosts hg_$i | grep ok | awk '{if($5==0) print $0}' | wc -l`
((expression))
可用作替代
((表达式((根据下面在ARITHMETIC EVALUATION下描述的规则来评估表达式。如果表达式为非零,返回状态为0;否则返回状态为1
由于您使用的是bash
,因此与尝试在运行时生成变量名相比,更好的方法是使用关联数组来存储值。例如:
#!/bin/bash
lsfDir=/opt/ibm/lsf/10.1/linux3.10-glibc2.17-x86_64/bin
# Make idleNum an associative array
declare -A idleNum
# Note using a regular array here instead of a single string that relies on
# shell word splitting
Queue=(ser short medium large)
for i in "${Queue[@]}"
do
# No need to use grep or wc here; awk can do it all.
idleNum[$i]=$("$lsfDir/bhosts" "hg_$i" | awk '/ok/ && $5==0 { c++ } END { print c+0 }')
done
printf "%sn" "${idleNum[ser]}"
如果由于某种原因(比如被困在bash
的旧版本上(不能使用关联数组,declare
在构建变量名方面比eval
更好,因为它避免了评估任意字符串时的一系列潜在问题:
declare "${i}idleNum=$("$lsfDir/bhosts" "hg_$i" | awk '/ok/ && $5==0 { c++ } END { print c+0 }')"
要获得在运行时构造的具有名称的变量的值,可以使用间接展开:
i=ser
name="${i}idleNum"
printf "%sn" "${!name}"
另请参阅为什么$(...)
比backticks更受欢迎?来自bash常见问题解答。
与此相关的是,运行脚本https://www.shellcheck.net/以发现许多潜在问题。