如何将数字转换为包含值的字符串



我想得到一些数字,并将结果分配给一个自定义字符串我想得到数字,我可以在这个脚本的下一部分中使用它

这个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/以发现许多潜在问题。

相关内容

  • 没有找到相关文章

最新更新