Próbuję napisać skrypt, który musi sprawdzić, czy plik istnieje. W konsoli piszę
if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi
i rozumiem
not mod
ale kiedy piszę skrypt, aby zrobić to samo:
#!/bin/sh
if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi
a następnie uruchom skrypt, otrzymuję to:
./ex.sh: 2: [[: not found
mod
Zapisałem skrypt w bieżącym katalogu i nadałem mu nazwę ex.sh, a następnie upewniłem się, że jest wykonywalny. Aby wywołać skrypt, robię to:
./ex.sh
Dlaczego dostaję ten problem? Próbowałem już wielu rzeczy:
if [ -a /home ...
i
if test -a /home ...
Obaj wracają
13: -a: unexpected operator
bash
shell-script
Buzu
źródło
źródło
#!/bin/bash
Odpowiedzi:
Uruchamiasz skrypt napisany dla bash pod sh , który nie ma wielu rozszerzonych funkcji składniowych -
[[
jestbash
wbudowanym poleceniem i nie jest dostępny wsh
.Zmień
#!/bin/sh
na#!/bin/bash
lub na#!/usr/bin/env bash
.źródło
/bin/sh
jest dowiązaniem symbolicznym do/bin/bash
. I to chyba dość bezpiecznie założyć, żebash
jest/bin/bash
./bin/bash
na większości systemów Linux, ale/usr/pkg/bin/bash
na BSD lub/usr/local/bin/bash
jeśli kompiluje się bezpośrednio ze źródła./usr/bin/env
hacka (który używa tegobash
, co dzieje się w$PATH
tej chwili w dzwoniących ), ale YMMV. (I możesz utworzyć/bin/bash
dowiązanie symboliczne - jeśli masz uprawnienia administratora i nie masz nic przeciwko z nimi zadzierać/bin
.)/usr/local
jest tam, gdzie autotools decyduje się na umieszczenie go domyślnie. Jeśli chodzi o „osobiście”, podoba mi się to, że kilka różnych serwerów i maszyn wirtualnych pobiera z tego samego repozytorium skryptów / narzędzi i nie muszę ponownie edytować shebangów na połowie z nich po każdym zatwierdzeniu.Podaj bash zamiast sh podczas uruchamiania skryptu. Osobiście zauważyłem, że różnią się one w Ubuntu 12.10:
bash script.sh arg0 ... argn
źródło