'सिंटैक्स त्रुटि: "(" अप्रत्याशित "एक सरणी बनाते समय


37

मेरे पास दो (डेबियन) लिनक्स सर्वर हैं। मैं एक शेल स्क्रिप्ट बना रहा हूं।

पहले एक पर मैं इस प्रकार एक सरणी बनाता हूं:

#!/bin/bash
target_array=(
    "/home/user/direct/filename -p123 -r"
)

यह ठीक काम करता है। लेकिन जब मैं इसे दूसरे सर्वर पर चलाता हूं तो मुझे यह मिलता है:

Syntax error: "(" unexpected

जहाँ तक मैं बता सकता हूँ दोनों सर्वर एक ही हैं। क्या कोई इस पर प्रकाश नहीं डाल सकता है कि यह काम क्यों नहीं करता है?

अगर मैं इसे सीधे टर्मिनल में टाइप करता हूँ तो यह ठीक है ??


ऐसा प्रतीत होता है कि जब मैं इसे चलाता हूं

sh scriptname.sh

मुझे त्रुटि मिलती है, लेकिन अगर मैं इसे चलाता हूं

./scriptname.sh

यह ठीक लगता है। क्या फर्क पड़ता है?


क्या आपने दो सर्वर के बीच की स्क्रिप्ट को कॉपी-पेस्ट किया है? cat -v <script>यह देखने की कोशिश करें कि क्या चमत्कारी चर हैं।
लिलोक्स

2
shनहीं है bashयह रूप में और इतने चल sh scriptname.shगलत है
एरिक Renouf

जवाबों:


56

जब आप इसका उपयोग ./scriptname.shकरते हैं /bin/bashतो पहली पंक्ति के साथ निष्पादित होता है #!। लेकिन जब आप इसका उपयोग sh scriptname.shकरते हैं sh, तो ऐसा नहीं होता है bash

shखोल सरणियों बनाने के लिए कोई वाक्य रचना है, लेकिन बैश वाक्य रचना आप का इस्तेमाल किया है।


ठीक है, अब समझ में आता है। जैसा कि आप शायद बता सकते हैं कि मैं लिनक्स के लिए काफी नया हूं (वर्तमान में मेरी पॉवर्सशेल स्क्रिप्ट शेल / बैश स्क्रिप्ट को बदलने की कोशिश कर रहा हूं)। मैं ./अब से उपयोग करने के लिए छड़ी जाएगा । चीयर्स
IGGt

यही कारण है कि जरूरी नहीं है, लेकिन बीच समन्वय होना चाहिए #!/bin/shऔर sh script.sh(या #!/bin/bashऔर bash script.sh)
Konstantin Morenko

3
Sh भाषा में कोई सरणियाँ ( a[index]=xया a=(x y)) नहीं हैं। कुछ sh दुभाषिए सरणियों का समर्थन करते हैं, केवल ksh88 (लिनक्स AFAIK में पोर्ट नहीं किया गया है) और कुछ पुराने pdksh वेरिएंट समर्थन करेंगे a[index]=valueऔर नहीं a=(x y)। डेबियन पर, shआम तौर पर dashकोई सरणी समर्थन ( a[index]=xकाम नहीं करेगा) है।
स्टीफन चेज़लस

1
मैं अब से टुकड़े में मर सकता हूं! :)
पॉलो

0

रनिंग के ./scriptname.shपरिणामस्वरूप फ़ाइल की पहली पंक्ति पढ़ी जाएगी और देखें कि इसे bin / bin / bash´ चलाने की जरूरत है और बाकी स्क्रिप्ट को दुभाषिया sh scriptname.shको पास करना है , जबकि निष्पादित उपयोगकर्ता की मानक शेल (जैसे ऐश) के लिए फ़ाइल पास करेगा और यह भी है कि अन्य दुभाषिए ब्रेस का समर्थन नहीं करते हैं।


1
shयह जरूरी नहीं है कि "उपयोगकर्ता का मानक शेल" अक्सर इसका अपना निष्पादन योग्य (या सिम्लिंक) हो और shस्क्रिप्ट को संसाधित करने के लिए इसे लागू किया जाएगा। यह सच होगा, भले ही उस उपयोगकर्ता के लिए डिफ़ॉल्ट लॉगिन शेल हैbash
एरिक रेनॉफ

यह वह हिस्सा था जिसमें मैं इस समय पूरी तरह से निश्चित नहीं था। स्पष्टीकरण के लिए धन्यवाद!
dave_alcarin

0

इसके साथ sh scriptname.sh, आप इसे चला रहे हैं sh, जरूरी नहीं कि इसके साथ bashsh --versionदोनों मशीनों पर तुलना करने की कोशिश करें । और / या के साथ dpkg -S $(which sh)


यहां तक ​​कि अगर shयह एक सिमलिंक है, bashतो अलग तरीके से व्यवहार किया जाएगा जबsh
एरिक रेनॉफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.