मेरे पास एक साधारण कैलकुलेटर है जो आरएमआई का उपयोग करता है। क्लाइंट 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 उत्तर
आपको इनपुट फ़ील्ड विभाजक 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
चलाकर हटा दें।
IFS=
हटाएं और कोशिश करें। इसे आपकी समस्या का समाधान करना चाहिए
bash
के दायरे से बाहर है, आपको अपना java
कोड जांचना होगा।
संबंधित सवाल
नए सवाल
java
जावा एक उच्च स्तरीय प्रोग्रामिंग भाषा है। इस टैग का उपयोग तब करें जब आपको भाषा का उपयोग करने या समझने में समस्या हो। इस टैग का उपयोग शायद ही कभी किया जाता है और इसका उपयोग अक्सर [वसंत], [वसंत-बूट], [जकार्ता-ई], [Android], [javafx], [हडूप], [श्रेणी] और [मावेन] के साथ किया जाता है।
*
का उपयोग करना शुरू करते हैं, आपको समस्या होगी: ऐसा इसलिए है क्योंकि आप स्ट्रिंग को बुरी तरह से विभाजित कर रहे हैंvar
:stringarray=( $var )
के साथ, आप पथनाम के अधीन हैं विस्तार! मुझे नहीं पता कि आपने इसे कहाँ सीखा है, लेकिन कृपया इसे फिर कभी उपयोग न करें (और यदि आपने इसे इस साइट पर देखा है, तो कृपया उस उत्तर को डाउनवोट करें जो इसे दिखाता है)। साथ ही, आप उन उद्धरणों का उपयोग नहीं कर रहे हैं जहां आपको करना चाहिए: सभी विस्तारों को उद्धृत किया जाना चाहिए:"${stringarray[0]}"
,"${stringarray[1]}"
, आदि। दोहरे उद्धरणों के साथ।*
है, और आप अपनी स्क्रिप्ट का उपयोग करते हैं न कि नीचे इनियन की स्क्रिप्ट का, तो*
को वर्तमान निर्देशिका की सभी फाइलों से बदल दिया जाएगा। आप इसे आजमा सकते हैं:var='*'; stringarray=( $var ); declare -p stringarray
। इनियन के उत्तर के साथ, (स्ट्रिंग को विभाजित करने के लिएread
का उपयोग करके) आपको ग्लोबिंग में कोई समस्या नहीं होगी।