2012-09-28 130 views
0

我学习bash的,但现在我有很多的麻烦使这个脚本工作: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。我尝试了一些不同的东西,如{[¨,但没有任何工作。 是的,文件存在,它与脚本位于同一个文件夹中。

有什么建议吗?

+0

您正在脚本的目录中运行脚本还是将它放在路径中? – BugFinder

+0

试试[this](http://stackoverflow.com/a/4139214/645270)。 – keyser

+0

'[['和'[''需要用空格包围 - 并且参阅[bash手册](http://www.gnu.org/software/bash/manual/html_node/index.html) [''(http://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#Bourne-Shell-Builtins)(查找“test”)和[' [['](http://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html#Conditional-Constructs)。 –

回答

2
BATTERY='cat battery.txt' 

这并不执行cat battery.txt,它只是保存“猫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 ]]是一个壳复合命令(conditional expression)。

+0

为什么第一种形式比第二种更好? – Blender

+0

如果您需要在正在执行的内容中引用某些内容,或者需要将它们嵌套在一起,则使用起来更加简单。 – Mat

+0

我认为这解决了与猫的问题,但我仍然有这个错误: ./changewill。SH:线17:[[30:未找到命令 ./changewill.sh:线27:[[30:未找到命令 ./changewill.sh:线36:[[30:未找到命令 ./changewill .sh:行45:[[30:命令没有找到 ./changewill.sh:行54:[[30:命令未找到 ./changewill.sh:行63:[[30:命令未找到 ./ changewill.sh:第72行:[[30:command not found – HumiD

0

为了得到一个命令的输出,你需要用反引号包住命令,不报价:

BATTERY=`cat battery.txt` 
     ^   ^
+0

谢谢!那有用 – HumiD

0

为条件的正确语法是

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

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

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

谢谢,那就是问题所在! – HumiD

+0

单方括号也是可以接受的。 '['...']'和'[['...']]'具有不同的语义;有关详细信息,请参阅bash文档。问题中代码中的问题之一是方括号周围没有空格。 –

+0

这没有解决问题'BATTERY'只是一个静态的一段文字,而不是(因为显然意)文件的内容。变量的值从字面上看就是'cat battery.txt'。 – tripleee