3

Это мой код:

#!/bin/bash
if [[ -d ~/viwiki ]]; then
 cd ~/viwiki
else
 mkdir ~/viwiki
 cd ~/viwiki
fi
if ! [[ -d ./log ]]; then
 mkdir log
 mkdir log/log
 mkdir "log/wget"
elif ! [[ -d ./log/log ]]; then
 mkdir log/log
elif ! [[ -d "./log/wget" ]]; then
 mkdir "log/wget"
fi

При запуске он имеет ошибки:

tuankiet65@UbuntuPC:~$ sh viwik/test2.sh
viwik/test2.sh: 2: viwik/test2.sh: [[: not found
viwik/test2.sh: 8: viwik/test2.sh: [[: not found

Как я могу это исправить?

1 ответ1

9

Я предполагаю, что если вы запустите

readlink -f $(which sh)

вы не получите Bash в качестве возвращаемого значения, но Dash. У вас правильная преамбула, но это имеет значение, только если вы запустите скрипт как ./test2.sh после того, как сделаете его исполняемым.

Прямо сейчас вы запускаете скрипт через интерпретатор sh , который, вероятно, является Dash, а конструкция [[]] является специфичной для Bash.

Вот почему?». Если вы просто замените двойные скобки на одинарные (и измените #!/bin/bash to #!/bin/sh , так как ваш сценарий теперь использует только функции POSIX), он должен работать как задумано.


Демонстрация на Debian, с test.sh с содержимым:

#!/bin/bash
if [[ "string" == "string" ]]; then
    echo This is Bash
fi

Бывает:

$ readlink -f $(which sh)
/bin/dash
$ sh test.sh 
test.sh: 2: test.sh: [[: not found
$ bash test.sh 
This is Bash
$ chmod 755 test.sh
$ ./test.sh
This is Bash

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .