Я пытаюсь написать скрипт, который должен проверить, существует ли файл. В консоли пишу
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
bash
shell-script
Буза
источник
источник
#!/bin/bash
Ответы:
Вы запускаете скрипт, написанный для bash, под sh , в котором отсутствуют многие расширенные возможности синтаксиса -
[[
этоbash
встроенная команда, которая недоступна вsh
.Изменить
#!/bin/sh
на#!/bin/bash
или на#!/usr/bin/env bash
.источник
/bin/sh
есть символическая ссылка на/bin/bash
. И, вероятно, достаточно безопасно предположить, чтоbash
это так/bin/bash
./bin/bash
на большинстве систем Linux, но/usr/pkg/bin/bash
на BSD, или/usr/local/bin/bash
если один компилируется непосредственно из исходного кода./usr/bin/env
хак (который использует тот, которыйbash
случается в вызывающих$PATH
в данный момент), но YMMV. (И вы можете сделать/bin/bash
символическую ссылку - если у вас есть права администратора, и вы не против возиться/bin
.)/usr/local
где autotools решает поместить его по умолчанию. Что касается «лично», мне нравится иметь несколько разных серверов и виртуальных машин, извлекаемых из одного и того же хранилища скриптов / инструментов, и мне не нужно повторно редактировать shebang на половине из них после каждого коммита.Укажите bash вместо sh при запуске скрипта. Я лично заметил, что они разные под Ubuntu 12.10:
bash script.sh arg0 ... argn
источник