Bash 脚本无法识别布尔逻辑,"command not found"



我是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],双括号,没有引号,() - 托架单和双人,我失去了理智。似乎Bash根本没有意识到这是一种说法。怎么了?谢谢!

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

编辑:此处建议的适当语法可以解决问题,谢谢大家!我仍在寻找Bash上的好指南:)

正如@fedorqui所说,您需要支架周围的空间。那是因为[实际上是test的同义词,一个真实程序,实际命令的名称也是如此。

为了使您的生活更加轻松,请改用空格和双括号([[]])。这些是通过Bash内部处理的,并且在意外错误(例如忘记围绕可变替代的引号)方面更加强大。另外, &&||用作逻辑和或在双括号中的工作,但是在单个支架中不是 - 您必须在 [ ]表达式中使用 -a-o

使用双支架(bash中的"条件表达式"),您可以写:

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

并获得您期望的结果。

将以下内容作为最佳实践:

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

注意相等测试的spaces==

||&&double brackets中工作。还有其他一些不错的功能,例如REGEX=~匹配以及像运营商一样在C-like languages中所知道的,以及更少的惊喜。

最新更新