linux 值串与定值比较

5w9g7ksd  于 2023-02-07  发布在  Linux
关注(0)|答案(5)|浏览(109)

我在Debian Linux 11下写了一个小脚本,它应该检查应用程序当前有多少个示例在运行,GPU卡的功耗是多少。我把它保存在name test下,每次我通过SSH访问示例时,它都会启动

#!/bin/sh
clear
a=$(nvidia-smi -q -i 0 | grep "Power Draw" | cut -c45-50) 
b=$(nvidia-smi -q -i 1 | grep "Power Draw" | cut -c45-50) 
c=$(nvidia-smi -q -i 2 | grep "Power Draw" | cut -c45-50) 
d=$(nvidia-smi -q -i 3 | grep "Power Draw" | cut -c45-50) 
zet=$( echo "$a" + "$b" + "$c" + "$d"  | bc -l )
echo "SYSTEM DRAW:" "$zet"
if [ "${zet}" -gt 150 ]; then          
echo WARRNING - SYSTEM DRAW LOW                                       
else
echo OK  
fi
sleep 8
exit
a11xaf1n

a11xaf1n1#

您可以在要调试的部分之前添加set -x,这将显示bash中正在发生的调试,并通过在set +x之后插入来停止它
例如:

set -x
power=$150
echo "SYSTEM DRAW :" $total
if [ $total \> $power ] ; then # escape > otherwise it redirects output

我认为您没有设置$150的值
如果未设置其中一个比较值,脚本可能会失败。因此,您应该在脚本开始时或通过bash将变量初始化为"等于0""作为缺省值
例如:

power=${150:-10} # if $150 does not have a value or empty, the default value of $power will be set to `10`
h79rfbju

h79rfbju2#

可能出现的问题很多,但您可以使用bc比较可能的十进制值:

if [ "$(echo "$total > $power" | bc)" = 1 ]; then
ar7v8xwq

ar7v8xwq3#

一个问题是[(和[[)执行 * string * 比较,而您需要 * numeric * 比较,为此您需要使用((,如下所示

if (( $total > 150 )); then
    echo "WARNING..."
else
    echo "OK"
fi

会工作得更好。否则总共1000会打印好,90会给出警告。
其他问题:

  • $150为您提供了一个名为150的变量的值--您可能希望删除$
  • 除了像[[((这样的特殊形式之外,>将执行输出重定向,而不是像[这样的命令的"常规"参数。
i5desfxk

i5desfxk4#

正如评论所推荐的,使用shellcheck,然而,我认为你的意图不是你所写的。
尝试创建一个脚本(即myscripy

#! /bin/bash

power=$150
echo "power=$power"

然后运行它

./myscript abc

并打印

power=abc50

这可能和你想象的大不相同。
这是因为power将获取第一个参数的值($1)并附加50
如果你想要参数号150(* 也是非常不可能的 *),你应该写

power=${150}

但如果你只想要数字

power=150

编辑

根据注解,使用

zet=$(bc <<<"$a+$b+$c+$d")

如果值是浮点,则计算zet
用于比较

if [ "$(bc <<<"$zet>150")" == 1 ]; then
  ...
fi
ix0qys7i

ix0qys7i5#

所有我需要添加的是这一行x=${x%.*},转换十进制数的数字没有小数和脚本工程完美。

相关问题