【问题标题】:Convert an output to string将输出转换为字符串
【发布时间】:2013-07-27 17:18:33
【问题描述】:

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

这是我的代码:

#!/bin/bash

a=$(acpitool -a)

echo "$a"

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

它不工作;变量$a 不能与字符串“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

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

【问题讨论】:

  • 比较的时候把$a放在引号里怎么样?比如:if "$a" -eq "AC adapter : online"?
  • 欢迎来到 Stack Overflow。请尽快阅读About 页面。你在你的问题上做得很好;你展示了代码,你解释了你想要什么以及你得到了什么错误——这些都是很好的技术。

标签: linux bash shell ubuntu


【解决方案1】:

请试试这个 -

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

    echo "$a"

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

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

【讨论】:

  • 这将解决问题,但如果您解释原因,您的答案将会得到改善。
  • @JonathanLeffler:我希望现在更好。非常感谢您的建议。
  • 是的,这样更好。您(尚未)注意到您将 test 命令添加到 if 语句中。 :) 只是采摘尼特。
  • 我猜他可以解决这个问题:) 而且你回答的问题已经足够我猜想了。所以,我不会太担心:)
【解决方案2】:

如何解决问题

shell(或test 命令)使用= 表示字符串相等,使用-eq 表示数值相等。某些版本的 shell 支持 == 作为 = 的同义词(但 = 由 POSIX test 命令定义)。相比之下,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"

shell 将其扩展为:

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

这是一个执行命令AC 的请求,其中显示了 5 个参数,并将命令的退出状态与 0 进行比较(将 0 - 成功 - 视为真,任何非零都视为假)。显然,您的系统上没有名为 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命令与[命令相同,只是命令名称为[时,最后一个参数必须为]

【讨论】:

    【解决方案3】:

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

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

    不带方括号的bash 尝试执行表达式并计算返回值。

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

    a="$(acpitool -a)"
    

    【讨论】:

    • a="$(acpitool -a)" 周围的双引号不是必需的,尽管它们没有害处 - 除非命令需要双引号参数,在这种情况下,外部双引号会使事情复杂化最好放下它们。
    • @JonathanLeffler 不,他们没有。在这方面,$() 的命令替换与`` 的命令替换不同。像a="$(echo "foo bar")" 这样的东西就可以了。
    • 呃...ISTR 最近遇到了这个问题,你说得对,a="$(echo "a ")" 工作正常。它让我很困惑,所以我不会这样做,但是我在真正重要的 shell 中学习了 shell 编码(根本没有 $(...) 的那些 - 它还没有被发明出来),所以我倾向于守旧。
    【解决方案4】:

    我发现我们可以使用git commit --amend 来触发工作流,而无需更改任何代码。 例子: build.yml

    on: 
      push:
        branches:
          - cicd
    

    git 命令:

    # cd cicd branch
    git commit --amend
    git push --force
    

    【讨论】:

      【解决方案5】:

      问题解决了!

      这是新代码,感谢大家的帮助。

      #!/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
      

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

      【讨论】:

        猜你喜欢
        • 2023-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-09
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 2022-10-02
        相关资源
        最近更新 更多