Чому я отримую [[: не знайдено під час запуску сценарію?


15

Я намагаюся написати сценарій, який повинен перевірити, чи існує файл. У консолі пишу

if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

і я отримую

not mod

але коли я пишу сценарій, щоб зробити те саме:

#!/bin/sh
if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

а потім виконати сценарій, я отримаю такий:

./ex.sh: 2: [[: not found
mod

Я зберег скрипт у поточному каталозі та назвав його ex.sh, після чого переконався, що він виконується. Щоб викликати сценарій, я роблю це:

./ex.sh

Чому я отримую цю проблему? Я вже спробував багато речей:

if [ -a /home ...

і

if test -a /home ...

Обоє повертаються

13: -a: unexpected operator

Мені вдалося змусити його працювати, але для цього мені довелося видалити перший рядок (#! / Bin / sh) Чи знаєте ви, чому це відбувається?
Buzu

спробуй#!/bin/bash
кев

привіт кеве, я теж це зрозумів. Я щойно оновив своє запитання. Я витратив надто багато часу на це, але радий, що міг це вирішити. Дякую за вашу відповідь. Це справді рішення проблеми.
Buzu

@Kev Будь ласка, опублікуйте це як відповідь
slhck

Buzu, @Kev - якщо ви знайдете відповідь, опублікуйте її як відповідь нижче , не редагуйте питання.
користувач1686

Відповіді:


10

Ви запускаєте сценарій, написаний для bash під sh , якому не вистачає багатьох розширених функцій синтаксису - [[це bashвбудована команда і недоступна в sh.

Змінити #!/bin/shна #!/bin/bashабо на #!/usr/bin/env bash.


У деяких системах /bin/shє символьним посиланням на /bin/bash. І, мабуть, досить безпечно припустити, що bashце так /bin/bash.
Кіт Томпсон

@Keith: Це в /bin/bashбільшості систем Linux, але /usr/pkg/bin/bashна BSD або /usr/local/bin/bashякщо компілюється безпосередньо з джерела.
користувач1686

@grawity: Або де б ви не вирішили поставити його, якщо компілювати з джерела. Гаразд, хороший момент. Особисто я б скоріше відредагував шебанг для кожної системи, ніж використовував /usr/bin/envхак (який використовує те, що в даний момент bashє у абонентів $PATH), але YMMV. (І ви можете створити /bin/bashсимпосилання - якщо у вас є права адміністратора і ви не проти заплутатися /bin.)
Кіт Томпсон

@Keith: /usr/localце місце, де autotools вирішує поставити його за замовчуванням. Що стосується "особисто", мені подобається мати декілька різних серверів і VM, які витягуються з одного сховища скриптів / інструментів, і не потрібно повторно редагувати шебаги на половині з них після кожного вчинення.
користувач1686

ніхто з них не працював на мене: / im on centos
astroanu

0

Укажіть bash замість sh при запуску сценарію. Я особисто помітив, що вони різні в ubuntu 12.10:

bash script.sh arg0 ... argn

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.