【问题标题】:Bash script error with cat and ifcat 和 if 的 Bash 脚本错误
【发布时间】:2012-09-20 02:41:15
【问题描述】:

我正在学习 bash,但现在我在制作这个脚本时遇到了很多麻烦:

#!/bin/bash

A="0"
B="0"
C="0"
D="0"
E="0"
F="0"
G="0"

while true; do

sleep 1

BATTERY='cat battery.txt'

if [["$BATTERY" -le 100] && ["$BATTERY" -gt 85] && [$A -eq 0]]; then

A="1"
    commands... 

elif [["$BATTERY" -le 85] && ["$BATTERY" -gt 70] && [$B -eq 0]]; then

B="1"
    commands...

elif [["$BATTERY" -le 70] && ["$BATTERY" -gt 55] && [$C -eq 0]]; then

C="1"
    commands...

elif [["$BATTERY" -le 55] && ["$BATTERY" -gt 40] && [$D -eq 0]]; then

D="1"
commands...

elif [["$BATTERY" -le 40] && ["$BATTERY" -gt 25] && [$E -eq 0]]; then

E="1"   
    commands...

elif [["$BATTERY" -le 25] && ["$BATTERY" -gt 10] && [$F -eq 0]]; then

F="1"
commands...

elif [["$BATTERY" -le 10] && ["$BATTERY" -gt 0] && [$G -eq 0]]; then

G="1"
commands...
fi
done

执行此脚本时出现的错误是:

./changewill.sh: line 17: [[cat battery.txt: command not found
./changewill.sh: line 27: [[cat battery.txt: command not found
./changewill.sh: line 36: [[cat battery.txt: command not found
./changewill.sh: line 45: [[cat battery.txt: command not found
./changewill.sh: line 54: [[cat battery.txt: command not found
./changewill.sh: line 63: [[cat battery.txt: command not found
./changewill.sh: line 72: [[cat battery.txt: command not found

我一直在阅读和环顾四周,我认为 cat 输出已正确分配给 BATTERY。我尝试了一些不同的东西,比如{[¨,但没有任何效果。 是的,该文件存在并且与脚本位于同一文件夹中。

有什么建议吗?

【问题讨论】:

  • 您是在脚本目录中运行脚本还是在路径中运行脚本?
  • 试试this
  • [[[ 都需要用空格括起来——有关[(查找“测试”)和[[ 的更多信息,请参阅bash manual

标签: bash variables if-statement syntax-error cat


【解决方案1】:

要获得命令的输出,您需要用反引号而不是引号来包装命令:

BATTERY=`cat battery.txt`
        ^               ^

【讨论】:

    【解决方案2】:
    BATTERY='cat battery.txt'
    

    这不会执行cat battery.txt,它只是将“cat battery.txt”作为字符串保存到该变量中。

    你应该:

    BATTERY=$(cat battery.txt)
    

    BATTERY=`cat battery.txt`
    

    (首选第一种形式。)

    您的测试也有语法错误。用例:

    elif [[ $BATTERY -le 10 && $BATTERY -gt 0 && $G -eq 0 ]]; then ...
    

    [[[ 实际上是完全不同的东西。

    [test 程序(查看ls /usr/bin/[man test),[[ expr ]] 是一个shell 复合命令(conditional expression)。

    【讨论】:

    • 为什么第一种形式比第二种好?
    • 如果你需要在你正在执行的东西中引用一些东西,或者如果你需要嵌套它们,它会更容易使用。
    • 我认为这解决了 cat 的问题,但我仍然有这个错误:./changewill.sh: line 17: [[30: command not found ./changewill.sh: line 27 :[[30:找不到命令./changewill.sh:第36行:[[30:找不到命令./changewill.sh:第45行:[[30:找不到命令./changewill.sh:第54行:[ [30:未找到命令 ./changewill.sh:第 63 行:[[30:未找到命令 ./changewill.sh:第 72 行:[[30:未找到命令
    • [ 后面需要一个空格。实际上,您的测试看起来都很奇怪。
    【解决方案3】:

    条件的正确语法是

    [[ $BATTERY -le 55 && $BATTERY -gt 40 && $D -eq 0 ]]
    

    即没有单方括号。对于数字比较,您也可以使用双括号:

    if (( BATTERY==55 && BATTERY > 40 && D == 0 )) ; then ...
    

    【讨论】:

    • 谢谢,这就是问题所在!
    • 单方括号也是可以接受的。 [ ... ][[ ... ]] 具有不同的语义;有关详细信息,请参阅 bash 文档。问题中代码中的问题之一是方括号周围缺少空格。
    • 这无法解决BATTERY 只是一段静态文本,而不是(显然是预期的)文件内容的问题。变量的值实际上是cat battery.txt
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 2016-08-24
    • 2021-03-08
    • 2017-12-29
    相关资源
    最近更新 更多