मेरे पास एक साधारण कैलकुलेटर है जो आरएमआई का उपयोग करता है। क्लाइंट 3 तर्क लेता है, ऑपरेंड 1, ऑपरेंड 2 और ऑपरेटर। इसे निम्नलिखित द्वारा आमंत्रित किया जा सकता है:

java SingleCalculatorClient 8 9 /

और आउटपुट यह होना चाहिए:

ebin@tux:~/DS$ java SingleCalculatorClient 8 9 +
Expected result of 8+9(by direct operation) : 17
Popped value of 8+9from stack : 17

एक ही सर्वर तक पहुँचने वाले कई क्लाइंट के परीक्षण के लिए, मेरे पास एक टेक्स्ट फ़ाइल है जिसमें प्रारूप ऑपरेंड 1, ऑपरेंड 2 और ऑपरेटर के साथ कुछ पंक्तियाँ हैं। एक नमूना फ़ाइल इस प्रकार है:

5 4 +
6 7 /
8 8 -

मेरे पास एक बैश स्क्रिप्ट है, जो फ़ाइल को पढ़ती है, लाइनों को विभाजित करती है, इसके भीतर जावा क्लाइंट को कॉल करती है। स्क्रिप्ट इस प्रकार है:

#!/bin/bash
input="test.txt"
while IFS= read -r var
do
  stringarray=( $var )
  java SingleCalculatorClient ${stringarray[0]} ${stringarray[1]} ${stringarray[2]}
done < "$input"

किसी भी तरह, जब मैं इसे चलाता हूं, जावा आउटपुट बहुत अजीब होता है। एक नमूना आउटपुट यह है:

ebin@tux:~/DS$ ./script.sh 
4(by direct operation) : 0
4from stack : 0 5+
7(by direct operation) : 0
7from stack : 0 6/
8(by direct operation) : 0
8from stack : 0 8-

भले ही यह फ़ाइल में केवल एक पंक्ति हो, आउटपुट हमेशा 0 होता है। और मुझे समझ में नहीं आता क्यों आउटपुट स्टेटमेंट को छोटा कर दिया जाता है।

अगर मैं विभाजित शब्दों को बैश में प्रिंट करने का प्रयास करता हूं, तो यह सही साबित होता है। अगर मैं इसे प्रतिध्वनित करता हूं, तो यह आउटपुट है:

ebin@tux:~/DS$ ./script.sh 
5 4 +
6 7 /
8 8 -

और फ़ाइल को पढ़ने और शब्दों को विभाजित करने के बजाय, अगर मैं सिर्फ जावा क्लाइंट को बैश स्क्रिप्ट के भीतर कुछ तर्कों के साथ कॉल करता हूं, तो यह भी काम करता है।

यह जावा भाग है जो तर्क लेता है, और फिर एक ढेर पर धक्का देता है:

               int x = Integer.parseInt(args[0]);
               int y = Integer.parseInt(args[1]);
               String operation = args [2];
               if(operation.equals("x"))
                operation="*";

               Calculator calculator = (Calculator) Naming.lookup("rmi://127.0.0.1:1100/CalculatorOperations");
               calculator.pushValue(x);
               calculator.pushValue(y);
               calculator.pushOperator(operation);

स्टैक पर, यह केवल मूल्यों को पॉप कर रहा है, और स्विच स्टेटमेंट का उपयोग करके अंकगणित करता है।

तो मुझे लगता है कि समस्या कहीं शब्दों को विभाजित करने में है, लेकिन निश्चित नहीं है। क्या कोई मुझे यह बताने में मदद कर सकता है कि समस्या कहां है और इसे कैसे हल किया जाए?

1
screenslaver 5 फरवरी 2017, 13:49
अपने प्रश्न में अपना जावा कोड जोड़ें।
 – 
Cyrus
5 फरवरी 2017, 13:57
2
क्या आप विंडोज़ पर हैं, और यूनिक्स न्यूलाइन्स का उपयोग करना भूल गए हैं? बैश टैग जानकारी में समस्याग्रस्त कोड के बारे में पूछने से पहले देखें...
 – 
gniourf_gniourf
5 फरवरी 2017, 14:18
मैं उबंटू 16.04 पर हूं
 – 
screenslaver
5 फरवरी 2017, 14:29
1
असंबंधित टिप्पणी: जैसे ही आप उत्पाद संचालन * का उपयोग करना शुरू करते हैं, आपको समस्या होगी: ऐसा इसलिए है क्योंकि आप स्ट्रिंग को बुरी तरह से विभाजित कर रहे हैं var: stringarray=( $var ) के साथ, आप पथनाम के अधीन हैं विस्तार! मुझे नहीं पता कि आपने इसे कहाँ सीखा है, लेकिन कृपया इसे फिर कभी उपयोग न करें (और यदि आपने इसे इस साइट पर देखा है, तो कृपया उस उत्तर को डाउनवोट करें जो इसे दिखाता है)। साथ ही, आप उन उद्धरणों का उपयोग नहीं कर रहे हैं जहां आपको करना चाहिए: सभी विस्तारों को उद्धृत किया जाना चाहिए: "${stringarray[0]}", "${stringarray[1]}", आदि। दोहरे उद्धरणों के साथ।
 – 
gniourf_gniourf
5 फरवरी 2017, 14:36
1
टक्सबिन: यदि आपकी टेक्स्ट फ़ाइल में एक एकल * है, और आप अपनी स्क्रिप्ट का उपयोग करते हैं न कि नीचे इनियन की स्क्रिप्ट का, तो * को वर्तमान निर्देशिका की सभी फाइलों से बदल दिया जाएगा। आप इसे आजमा सकते हैं: var='*'; stringarray=( $var ); declare -p stringarray। इनियन के उत्तर के साथ, (स्ट्रिंग को विभाजित करने के लिए read का उपयोग करके) आपको ग्लोबिंग में कोई समस्या नहीं होगी।
 – 
gniourf_gniourf
5 फरवरी 2017, 15:49

1 उत्तर

सबसे बढ़िया उत्तर

आपको इनपुट फ़ील्ड विभाजक IFS= को रीसेट नहीं करना चाहिए, एक पंक्ति में अलग-अलग फ़ील्ड तक पहुंचने के लिए इसका डिफ़ॉल्ट मान tab/space/newline होना चाहिए। इसके अलावा, आप -a विकल्प खो रहे हैं, जिसे read को सरणी में पढ़ने की जरूरत है ताकि आप अलग-अलग तत्वों तक पहुंच सकें। अर्थात।

input="test.txt"
while read -r -a var
do
  java SingleCalculatorClient "${var[0]}" "${var[1]}" "${var[2]}"
done < "$input"

या) आपको किसी सरणी की आवश्यकता नहीं है बस read के लिए अलग-अलग चर का उपयोग करें

input="test.txt"
while read -r op1 op2 op
do
  java SingleCalculatorClient "$op1" "$op2" "$op"
done < "$input"

ध्यान दें:-

एक ओर ध्यान दें, यदि आप विंडोज से लिनक्स मशीन पर पेस्ट कोड कॉपी कर रहे हैं, तो DOS CRLF एंडिंग्स को dos2unix script.sh चलाकर हटा दें।

2
Community 20 जून 2020, 12:12
@tuxebin: मेरा अपडेट देखें, IFS= हटाएं और कोशिश करें। इसे आपकी समस्या का समाधान करना चाहिए
 – 
Inian
5 फरवरी 2017, 14:06
यह ऐसा ही है :(
 – 
screenslaver
5 फरवरी 2017, 14:10
@tuxebin: यह bash के दायरे से बाहर है, आपको अपना java कोड जांचना होगा।
 – 
Inian
5 फरवरी 2017, 14:12
इसे मैन्युअल रूप से चलाने से सही आउटपुट मिलता है। बैश स्क्रिप्ट के अंदर चल रहा है, लेकिन स्पष्ट रूप से तर्क देना भी काम करता है। तो क्या यह एक जावा मुद्दा हो सकता है?
 – 
screenslaver
5 फरवरी 2017, 14:18
: यदि आप अपनी समस्या का समाधान करते हैं तो आप उत्तर को स्वीकार कर सकते हैं
 – 
Inian
5 फरवरी 2017, 16:11