2015-10-09 4 views
0

Итак, я пишу скрипт, который должен проверить, существует ли файл или нет до его выполнения. У меня есть следующий код:Тестовый сценарий оболочки оболочки

if [[ \(-d "DIR2" \) != true ]]; 
then 
    echo "nonexistent dir" 
    exit 1 
elif [[ \(-d "DIR1" || -f "DIR1" \) != true ]]; 
then 
    echo "nonexistent dir or file" 
    exit 1 
fi 

Я, кажется, делают что-то неправильно со скобками, так как я получаю следующее:

./syncdir.sh: line 11: conditional binary operator expected 
./syncdir.sh: line 11: syntax error near `-d' 
./syncdir.sh: line 11: `if [[ \(-d "DIR2" \) != true ]];' 

Я нахожу это странным, что Баш ожидает бинарного оператора Isnt «! = 'один?
Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно и почему?


Я действительно запутался в скобках, но до сих пор не получил этого.

+0

Для условных вы начинаете [здесь] (http://tldp.org/LDP/Bash-Beginners-Guide/html/chap_07.html). Однако то, что вы делаете, - это плохая практика, потому что ваш код (даже при работе) - идеальное состояние гонки. Вам лучше просто получить доступ к папке и обработать ошибку, если папка не существует. – hek2mgl

+0

Как это создать состояние гонки? –

+1

@MiguelM Состояние гонки таково: ваш тест преуспевает, потому что каталог существует, затем другой процесс удаляет каталог, а затем ваш процесс пытается использовать каталог, который больше не существует. –

ответ

2

Синтаксис вашего состояния полностью неправильный. Оно должно быть:

if [[ -d "DIR2" ]]; 

и

if [[ ! (-d "DIR1" || -f "DIR1") ]]; 

Если у вас есть скобки внутри условного выражения, вам не нужно, чтобы избежать их (что это только необходимо, если вы используете команду [). И вам не нужно сравнивать с true или false.

+0

Итак, я могу использовать круглые скобки внутри [[]]? Но что было причиной ошибки в первую очередь? –

+0

Ошибка была связана с тем, что вы избежали скобок. Поэтому он рассматривал их как литеральные строки, а не часть синтаксиса выражения. – Barmar

+0

Даже если я беру(), это дает мне ошибку, и решение, которое вы мне дали, также не работает:/но я думаю, что могу заставить его работать. Моя цель состояла в том, чтобы проверить, был ли DIR1 файлом или каталогом, и если DIR2 был только каталогом. –

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