मैसेजिंग। शशि: लाइन 29: [: मिसिंग `]


5

मुझे नहीं पता कि यह एक बुरी बात है, या इसका क्या मतलब है। मेरी स्क्रिप्ट अभी भी ठीक काम कर रही है, लेकिन क्या मुझे इसे ठीक करना चाहिए?

#!/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]="mainmini@192.168.1.65"

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

लिनक्स / यूनिक्स साइट पर
माइकल डुरंट

स्ट्रिंग alerttypeकभी भी स्ट्रिंग के समान नहीं होगी notification। शायद आपका मतलब है [ "$alerttype" = "notification" ]?
चार्ल्स डफी

(और हां, मेरा मतलब है =, नहीं ==- pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html पर POSIX विनिर्देश देखें , और आप देखेंगे कि समर्थित स्ट्रिंग तुलना सिंटैक्स है s1 = s2; ==यह एक संक्षिप्त विस्तार है, और) सभी ऑपरेटिंग सिस्टम और शेल इसका समर्थन नहीं करेंगे; यदि आप पोसिक्स-मानक एक के बजाय स्पष्ट रूप से बैश-विस्तारित तुलना ऑपरेटर का उपयोग करना चाहते हैं, तो यह [[ ]]नहीं है [ ])।
चार्ल्स डफी

हाँ, जब से मैंने यह पोस्ट किया मुझे एहसास हुआ कि
याकूब_

1
इस तरह की त्रुटियों को आसानी से पाया जा सकता है: shellcheck.net
SnakeDoc

जवाबों:


10

मैसेजिंग। शशि: लाइन 29: [: मिसिंग ']'

आप निम्नलिखित का उपयोग कर रहे हैं:

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

हालाँकि, उपरोक्त आदेश spaceपहले याद आ रहा है ], यह होना चाहिए:

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

शर्तों के बुनियादी नियम

जब आप लिखना शुरू करते हैं और अपनी शर्तों का उपयोग करते हैं, तो कुछ नियम हैं जिन्हें आपको उन त्रुटियों को रोकने के लिए पता होना चाहिए जो ट्रेस करना मुश्किल है। यहाँ तीन महत्वपूर्ण का पालन करें:

  1. हमेशा कोष्ठक और वास्तविक चेक / तुलना के बीच रिक्त स्थान रखें। निम्नलिखित काम नहीं करेगा:

    if [$foo -ge 3]; then

    बैश एक "लापता"] '' के बारे में शिकायत करेगा।

बैश स्क्रिप्टिंग में स्रोत स्थितियाँ (यदि कथन)


मुझे लगता है कि स्टीवन ने सिर्फ यह कहा, लेकिन आप सही हैं
याकूब_

हाँ, हम लगभग एक ही समय दिए ... मैं समय लगा क्योंकि मैं ऊपर देखो और सही सिंटैक्स के लिए एक संदर्भ को उद्धृत करना चाहता था: /
DavidPostill

मुझे पता है, मैं दोनों को
बढ़ाऊंगा

); आप "टिप्पणी" विशेषाधिकार के लिए आधे रास्ते होने लगते हैं
DavidPostill

यह उससे कहीं ज्यादा गलत है। यहां तक ​​कि [ "alerttype" == "notification" ], यह दो स्थिरांक की तुलना कर रहा है, जिसका अर्थ है कि यह कभी भी सच नहीं होगा। शायद एक छोर या दूसरा पक्ष एक चर संदर्भ होना चाहिए? इसके अलावा, ==POSIX कल्पना में नहीं है test; पोर्टेबल होने के लिए, यह होना चाहिए =
चार्ल्स डफी

5

आपको एक ही स्थान याद आ रहा है।

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

एक और उदाहरण:

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

$ if [ "a" == "a" ]; then echo "yes"; else echo "no"; fi
yes

1
यह उससे कहीं ज्यादा गलत है। यहां तक ​​कि [ "alerttype" == "notification" ], यह दो स्थिरांक की तुलना कर रहा है, जिसका अर्थ है कि यह कभी भी सच नहीं होगा। इसके अलावा, ==POSIX कल्पना में नहीं है test; पोर्टेबल होने के लिए, यह होना चाहिए =
चार्ल्स डफी

2

] इसके अलावा एक और प्रारूप विकल्प से पहले की जगह गुम है:

$ [ "a" == "a" ] && echo "yes" || echo "no"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.