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

EDIT: Правильный синтаксис, предложенный здесь, сделал трюк, спасибо всем! Я по-прежнему ищу хорошие гид на Bash :)

+3

добавить пробелы вокруг '[': 'if [" $ choice "==" 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" в Баш), вы можете написать:

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

и получить результат, который вы ожидаете.

+1

Обратите внимание, что '-a' и' -o' считаются устаревшими и не должны использоваться в новом коде. Используйте '[...] && [...]' и '[...] || [...] '(т. е. вместо двух отдельных' [команд]. – chepner

+0

@chepner Не знал этого! Не могли бы вы дать мне ссылку на детали? Благодаря! – cxw

Смежные вопросы