गोटो बिना बैश स्क्रिप्ट को हल करें


1

मेरे पास एक बैश स्क्रिप्ट है जिसे मैं कुछ करना चाहता हूं

read one_thing
read another_thing

और फिर यह देखने के लिए कुछ कोड चलाता है कि क्या another_thing उपलब्ध है या पहले से ही लिया गया है, और यदि इसे लिया जाता है, तो इसे उपयोगकर्ता को चेतावनी देनी चाहिए और फिर से चलना चाहिए

read another_thing

इसलिए हमारे पास एक नया मूल्य हो सकता है, छोड़कर one_thing अबाधित। चूंकि वहाँ कोई नहीं है goto बाश में, मैं सोच रहा हूँ कि कैसे करना है। मेरा अब तक का सबसे अच्छा अनुमान है कि शायद मुझे लपेटना चाहिए read another_thing किसी फ़ंक्शन के अंदर, ताकि यदि आवश्यक हो, तो यह केवल खुद को कॉल करेगा, लेकिन मुझे लगता है कि इसे करने के लिए एक "क्लीनर" तरीका होना चाहिए। मैं इसे करने के लिए कुशल तरीकों के सुझावों की तलाश कर रहा हूं।


3
यह प्रश्न स्टैकटेक्चेंज के लिए बेहतर अनुकूल होगा। वैसे भी, बस कुछ ही समय में अपने पढ़ने के बयान को संलग्न करें, कुछ इस तरह while $a==0 और $ a को 1 में बदल दें जब एक और_शैली को सही ढंग से पढ़ा गया हो।
terdon

कुछ वास्तविक कोड प्रदान करें ताकि हम बेहतर विचार प्राप्त कर सकें कि आप क्या करने की कोशिश कर रहे हैं।
JamesBarnett

लिपियों और कुछ स्क्रिप्टिंग भाषा के प्रश्न हैं ठीक SuperUser पर हालांकि अधिकांश प्रोग्रामिंग समस्याओं को StackOverflow का उपयोग करके बेहतर हल किया जाता है।
James Mertz

यह सवाल यहां रह सकता है। हम हमेशा विषय पर बाश स्क्रिप्ट पर विचार करते हैं, क्योंकि वे ज्यादातर बिजली उपयोगकर्ताओं द्वारा उपयोग किए जाते हैं।
slhck

जवाबों:


2

आप एक लूप में अपनी स्थिति की जांच कर सकते हैं, और break जब यह मिले तो उसमें से

#!/bin/bash

read -p 'Input something > ' one_thing

while true; do
  read -p 'Input something else > ' another_thing

  # Write some code to check if the requirements are met
  # Let's say in this case they are when the variable `thing_to_work` equals `done`

  if [[ "${thing_to_work}" == 'abcde' ]]; then
    break # Exit the loop
  else
    echo 'The requirements were not met, so the loop will start again'
  fi
done

1

जब मैं अपने डेस्कटॉप पर विंडोज से लिनक्स में चला गया, तो मेरे पास बहुत पहले से मौजूद था .BAT तथा .CMD कन्वर्ट करने के लिए फ़ाइलें और मैं उनके लिए तर्क को फिर से लिखने के लिए नहीं जा रहा था, इसलिए मैं मिल गया गोट बाश करने का एक तरीका जो काम करता है क्योंकि गोटो फ़ंक्शन चलता है sed स्क्रिप्ट के किसी भी भाग को हटाने के लिए स्वयं पर, जो चलाया नहीं जाना चाहिए, और फिर यह सब निकाल देता है:

#!/bin/bash

# BAT / CMD goto function
function goto
{
    label=$1
    cmd=$(sed -n "/^:[[:blank:]][[:blank:]]*${label}/{:a;n;p;ba};" $0 | 
          grep -v ':$')
    eval "$cmd"
    exit
}

apt update

# Just for the heck of it: how to create a variable where to jump to:
start=${1:-"start"}
goto "$start"

: start
goto_msg="Starting..."
echo $goto_msg
# Just jump to the label:
goto "continue"

: skipped
goto_msg="This is skipped!"
echo $goto_msg

: continue
goto_msg="Ended..."
echo "$goto_msg"

# following doesn't jump to apt update whereas original does
goto update

और मुझे ऐसा बिल्कुल भी नहीं लगता है कि लिनुस टॉर्वाल्ड्स ने प्रसिद्ध रूप से कहा:

से: लिनुस टोरवाल्ड्स
विषय: रे: २.६.०-परीक्षण का कोई मौका *?
दिनांक: सूर्य, १२ जनवरी २००३ 11:38:35 -0800 (PST)

मुझे लगता है कि गोटो ठीक हैं, और वे अक्सर बड़ी मात्रा में इंडेंटेशन की तुलना में अधिक पठनीय होते हैं। ऐसा इसलिए है ख़ास तौर पर सच है अगर कोड प्रवाह वास्तव में स्वाभाविक रूप से इंडेंट नहीं है (इस मामले में यह है, तो मुझे नहीं लगता कि गोटो का उपयोग करना किसी भी तरह से है साफ से अधिक नहीं, लेकिन सामान्य रूप से गोटो की पठनीयता के लिए काफी अच्छा हो सकता है)।

बेशक, पास्कल जैसी बेवकूफ भाषाओं में, जहां लेबल वर्णनात्मक नहीं हो सकते हैं, गोटो का बुरा हो सकता है। लेकिन यह गोटो की गलती नहीं है, यह भाषा डिजाइनर की बृहतता है।

कोड के लिए स्रोत (इसे कम त्रुटि वाला बनाने के लिए संशोधित किया गया है)
उद्धरण के लिए स्रोत


2
उत्कृष्ट उपयोग के मामले और रचनात्मक समाधान!
JakeGould

@JakeGould धन्यवाद! मुझे पता था कि यह शुद्ध दार्शनिक कारणों से पतन को आकर्षित करने वाला था, इसलिए आपका "थैंक यू" मुझे हर प्रोग्रामर के उपयोग के लिए आगे बढ़ने में मदद करता है जेएमपी चाहे या न चाहे ... ;-)
Fabby
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.