6

我正在尝试执行一个脚本来检查 CA 电源状态

这是我的代码:

#!/bin/bash

a=$(acpitool -a)

echo "$a"

if $a -eq "AC adapter : online"
then
echo "ONLINE"
else
echo "OFFLINE"
fi

它不工作;变量$aia 不与字符串“AC 适配器:在线”进行比较。如何将命令的输出转换为acpitool -a字符串?

这就是发生的事情:

AC adapter     : online 
./acpower.sh: linha 7: AC: comando não encontrado
OFFLINE

问题解决了!

这是新的代码,在你们所有人的帮助下,谢谢。

#!/bin/bash

# set the variable
a=$(acpitool -a)

# remove white spaces
a=${a// /}

# echo for test
echo $a

# compare the result
if [[ "$a" == 'ACadapter:online' ]]
then
# then that the imagination is the limit
echo "ONLINE"
else
# else if you have no imagination you're lost
echo "OFFLINE"
fi

此代码可以在服务器上使用,以在电源故障时发出警报!

4

5 回答 5

8

如何解决问题

shell(或test命令)=用于字符串相等和-eq数字相等。某些版本的 shell 支持==作为同义词=(但=由 POSIXtest命令定义)。相比之下,Perl==用于数值相等和eq字符串相等。

您还需要使用以下测试命令之一:

if [ "$a" = "AC adapter : online" ]
then echo "ONLINE"
else echo "OFFLINE"
fi

或者:

if [[ "$a" = "AC adapter : online" ]]
then echo "ONLINE"
else echo "OFFLINE"
fi

使用[[运算符,您可以将引号放在"$a".

为什么您收到错误消息

当你写道:

if $a -eq "AC adapter : online"

外壳将其扩展为:

if AC adapter : online -eq "AC adapter : online"

这是使用显示的 5 个参数执行命令的请求,并将命令AC的退出状态与 0 进行比较(将 0 - 成功 - 视为 true,将任何非零视为 false)。显然,您的系统上没有调用命令AC(这并不奇怪)。

这意味着您可以编写:

if grep -q -e 'some.complex*pattern' $files
then echo The pattern was found in some of the files
else echo The pattern was not found in any of the files
fi

如果要测试字符串,则必须使用test命令或[[ ... ]]运算符。该test命令与[命令相同,只是命令名称为[时,最后一个参数必须为]

于 2013-07-27T17:46:59.810 回答
3

将比较放在方括号中,并在 : 周围添加双引号$a

if [ "$a" == "AC adapter : online" ]; then
  ...

没有方括号bash会尝试执行表达式并计算返回值。

将命令替换放在双引号中也是一个好主意:

a="$(acpitool -a)"
于 2013-07-27T17:47:56.900 回答
2

请试试这个 -

    #!/bin/bash
    a="$(acpitool -a)"

    echo "$a"

    if [ "$a" == 'AC adapter : online' ]
    then
    echo "ONLINE"
    else
    echo "OFFLINE"
    fi

说明: -eq主要用于整数表达式的等价。所以,== 是要走的路!并且,在 $a 或 $(acpitool -a) 之间使用双引号来防止分词。用双引号括起来的参数将自身显示为一个单词,即使它包含空格分隔符。

于 2013-07-27T17:45:07.927 回答
1

问题解决了!

这是新的代码,在你们所有人的帮助下,谢谢。

#!/bin/bash

# set the variable
a=$(acpitool -a)

# remove white spaces
a=${a// /}

# echo for test
echo $a

# compare the result
if [[ "$a" == 'ACadapter:online' ]]
then
# then that the imagination is the limit
echo "ONLINE"
else
# else if you have no imagination you're lost
echo "OFFLINE"
fi

此代码可以在服务器上使用,以在电源故障时发出警报!

于 2013-07-27T21:39:10.840 回答
-1

I found we can use git commit --amend to trigger the workflow without changing any code. Example: build.yml

on: 
  push:
    branches:
      - cicd

git command:

# cd cicd branch
git commit --amend
git push --force
于 2020-06-16T07:53:14.290 回答