2016-12-16 92 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