messaging.sh: line 29: [: missing `] '

5

Nie wiem, czy to jest zła rzecz, ani co to znaczy. Mój skrypt nadal działa poprawnie, ale czy powinienem to naprawić?

#!/bin/sh
#This script will send text and maybe images to other computers via ssh and scp.
#Configuration files in same folder

source /Users/jacobgarby/Desktop/messaging/messages.cfg
TIME=$(date +"%H:%M:%S")
CONNECTED[0]="[email protected]"

if [ -d messages.log ]; then
    :
else
    touch messages.log
fi

read MSG

if [ "$MSG" == "!help" ]; then
    echo ; echo "!clear   Clear's your personal chat log."
    echo "!ban [usrname]    Prevents a user from entering this chat IN DEV."
else
    echo "$TIME | $USER | $MSG" >> messages.log; echo   >> messages.log; echo   >> messages.log
    tail messages.log
fi

for CONNECTION in CONNECTED; do
    echo "It works"
done

if [ "alerttype" == "notification"]; then
    osascript -e 'display notification "You have recieved a message!" with title "Message"'
else
    osascript -e 'display dialog "You have recieved a message!" with title "Message"'
fi
Jacob_
źródło
Należy do witryny Linux / Unix
Michael Durrant
Ciąg alerttype nigdy nie będzie taki sam jak łańcuch notification. Być może masz na myśli [ "$alerttype" = "notification" ]?
Charles Duffy
(i tak, to znaczy =, nie == - patrz specyfikacja POSIX pod adresem pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html i zobaczysz, że obsługiwana składnia porównania łańcuchów to s1 = s2; == jest rozszerzeniem bash i nie wszystkie systemy operacyjne i powłoki będą go obsługiwać; jeśli chcesz użyć operatora porównania o rozszerzonym bashu zamiast standardowego operatora POSIX, [[ ]], nie [ ] ).
Charles Duffy
Tak, odkąd to opublikowałem, zdałem sobie z tego sprawę
Jacob_
1
Tego rodzaju błędy można łatwo znaleźć za pomocą: shellcheck.net
SnakeDoc

Odpowiedzi:

10

messaging.sh: linia 29: [: brak ']'

Używasz następujących elementów:

if [ "alerttype" == "notification"]; then`

Jednak powyższemu poleceniu brakuje a space przed ], powinno być:

if [ "alerttype" == "notification" ]; then
                                  ^

Podstawowe zasady warunków

Kiedy zaczynasz pisać i używasz własnych warunków, są pewne zasady, które powinieneś znać, aby uniknąć błędów, które są trudne     ślad. Oto trzy ważne:

  1. Zawsze zachowuj odstępy między nawiasami a rzeczywistym sprawdzeniem / porównaniem. Następujące elementy nie będą działać:

    if [$foo -ge 3]; then

    Bash narzeka na „brakujące”] „”.

Źródło Warunki w skryptach bash (jeśli instrukcje)

DavidPostill
źródło
Myślę, że Steven właśnie to powiedział, ale masz rację
Jacob_
Tak, odpowiedzieliśmy mniej więcej w tym samym czasie ... Trwałem dłużej, ponieważ chciałem sprawdzić i zacytować odniesienie do poprawnej składni:
DavidPostill
Wiem, że wybrałbym obu, ale nie mam wystarczającej reputacji
Jacob_
Wydaje się, że jesteś w połowie drogi do przywileju „komentarz”;)
DavidPostill
To jest bardziej złe niż to. Tak jak [ "alerttype" == "notification" ], porównuje dwie stałe, co oznacza nigdy Mów prawdę. Być może jeden koniec lub druga strona powinny być zmiennym odniesieniem? Również, == nie jest w specyfikacji POSIX test; aby być przenośnym, musi być =.
Charles Duffy
5

Brakuje ci jednego miejsca.

#BEFORE
if [ "alerttype" == "notification"]; then
#AFTER
if [ "alerttype" == "notification" ]; then
#                                 ^

Inny przykład:

$ if [ "a" == "a"]; then echo "yes"; else echo "no"; fi
-bash: [: missing `]'
no

$ if [ "a" == "a" ]; then echo "yes"; else echo "no"; fi
yes
Steven
źródło
1
To jest bardziej złe niż to. Tak jak [ "alerttype" == "notification" ], porównuje dwie stałe, co oznacza nigdy Mów prawdę. Również, == nie jest w specyfikacji POSIX test; aby być przenośnym, musi być =.
Charles Duffy
2

Brakuje miejsca przed ] Inną opcją formatu jest:

$ [ "a" == "a" ] && echo "yes" || echo "no"
Michael Durrant
źródło