2016-12-16 97 views
0

我是Bash脚本的新手,试图制作我的第一个备份脚本。当我运行它,我总是得到这样的:Bash脚本无法识别布尔逻辑,“命令未找到”

./backupscript.sh: line 9: [3=1: command not found 
./backupscript.sh: line 9: 3=2]: command not found 
./backupscript.sh: line 15: [3=1: command not found 
./backupscript.sh: line 15: 3=3]: command not found 

我已经尝试了许多不同的语法,像["var"="1"]||["var"=2],双括号,不带引号,()-brackets单,双和我失去了我的脑海里。似乎bash根本不承认它是一个if语句。怎么了?谢谢!

#!/bin/bash 

cd/
NOW=$(date +"%m_%d_%Y") 
echo "Please input: 1=full 2=system 3=home" 
read choice 

if ["$choice"="1" || "$choice"="2"]; then 
echo "--- STARTING SYSTEMBACKUP ---" 
tar -cvpzf systembackup_$NOW.tar.gz --exclude=/proc --exclude=/lost+found --exclude=/systembackup.tar.gz --exclude=/mnt --exclude=/sys --exclude=/dev --exclude=/run --exclude=/media --exclude=/home/
echo "--- SYSTEM BACKUP DONE ---" 
fi 

if ["$choice"="1" || "$choice"="3"]; then 
echo "--- STARTING HOMEBACKUP (excluding ~/Seafile) ---" 
tar -cvpzf homebackup_$NOW.tar.gz --exclude=/home/matias/Seafile /home 
echo "--- HOMEBACKUP DONE ---" 
fi 

编辑:正确的语法建议在这里做的伎俩,谢谢大家!我还在寻找巴蜀好导游:)

+3

在'[':'if [“$选择”==“1”...“等等附近加上空格。 – fedorqui

+0

在修复if语句的同时,您应该小心使用'cd /',因为它可能会导致在错误的目录中发生操作 – Zlemini

+0

尝试http://shellcheck.net/请求人类帮助之前。 – tripleee

回答

0

使用以下为最佳实践:

if [[ $choice == 1 || $choice == 2 ]]; then 
    ... 
fi 

通知的spaces==平等的测试。

||&&工作在double brackets。还有一些其他不错的功能,如REGEX匹配=~与运营商一样,他们在C-like languages知道与较少的意外。

+1

您遗漏了一些关键空间。 – chepner

+0

感谢您的信息,实际上这次是在bash中运行它 –

0

正如@fedorqui所说,你需要括号内的空格。这是因为[实际上是一个真正的程序test的同义词,实际命令的名称也是如此。

为了使您的日后生活更轻松,请改用空格和双括号([[]])。这些是由bash内部处理的,并且对于意外错误比如忘记引用变量替换时更加强大。另外,&&||在双括号中用作逻辑AND和OR,但在单括号中不是而是 - 您必须使用-a-o代替[ ]表达式。

使用双括号("conditional expressions"在bash),你可以这样写:

if [[ $choice = 1 || $ choice = 3 ]]; then 
    ... 
fi 

,并得到你所期望的结果。

+1

请注意'-a'和'-o'被认为已经过时,不应该在新代码中使用。使用'[...] && [...]和'[...] || [(即两个独立的'['命令])。 – chepner

+0

@chepner不知道!请给我一个链接到细节?谢谢! – cxw