एक डिफ़ॉल्ट मान के साथ बैश में एक चर पढ़ें


191

मुझे बश लिपि में टर्मिनल से एक मान पढ़ने की आवश्यकता है। मैं एक डिफ़ॉल्ट मान प्रदान करने में सक्षम होना चाहता हूं जिसे उपयोगकर्ता बदल सकता है।

# Please enter your name: Ricardo^

इस स्क्रिप्ट में संकेत है "कृपया अपना नाम दर्ज करें:" डिफ़ॉल्ट मान "रिकार्डो" है और कर्सर डिफ़ॉल्ट मान के बाद होगा। क्या बैश स्क्रिप्ट में ऐसा करने का कोई तरीका है?

जवाबों:


280

आप पैरामीटर विस्तार का उपयोग कर सकते हैं जैसे

read -p "Enter your name [Richard]: " name
name=${name:-Richard}
echo $name

ब्रैकेट के बीच प्रॉम्प्ट में डिफ़ॉल्ट मान को शामिल करना एक काफी सामान्य सम्मेलन है


7
मैंने इसके आधार पर कुछ करना समाप्त किया। एक अस्थायी चर में पढ़ना inputऔर फिर उपयोग करना name=${input:-$name}
रिकार्डो मैरिमोन

41
यह वास्तव में सवाल का जवाब नहीं देता है। डिफ़ॉल्ट मान प्रॉम्प्ट में प्रदर्शित किया जाना चाहिए।
डॉ। पर्सन II II

3
और क्या करेंगे name=${!input:-$name}?
हैरी ली

8
@ Dr.PersonPersonII - आप कुछ ऐसा करके डिफ़ॉल्ट मान जोड़ सकते हैं: पढ़ें -p "दूरस्थ होस्ट नाम दर्ज करें [$ Remote_host_default]:" रिमोट_हस्ट रिमोट_हस्ट = $ {रिमोट_हॉट: - रिमोट_हिस_डेफॉल्ट}
Dobler

4
$1बन जाता है${1:-some_default_string}
थोरसुमोनर

160
read -e -p "Enter Your Name:" -i "Ricardo" NAME

echo $NAME

1
बहुत बढ़िया जवाब! मैं केवल यह उल्लेख करना चाहता हूं कि मुझे इससे परेशानी हो रही थी, क्योंकि मैंने "रिकार्डो" और NAME के ​​बीच की जगह नहीं देखी थी, लेकिन एक बार मुझे पता चला कि .... जादू ! धन्यवाद!
श्री मिकेल

40
दुर्भाग्य से -आई OSX 10.7 के लिए एक वैध विकल्प नहीं है
अपरिभाषित

3
@BrianMortenson आप homebrew का उपयोग करके बैश को अपग्रेड कर सकते हैं: stackoverflow.com/questions/16416195/…
antonagestam

2
यह उत्तर दिखाता है कि ओएस एक्स (बैश 3.x) पर यह काम कैसे किया जाता है: stackoverflow.com/questions/22634065/…
क्रिस्टोफ पेट्सचेनिग

3
बस ध्यान दें कि वास्तव में काम -eकरने की अनुमति -iदेना अनिवार्य लगता है
MestreLion

48

बैश 4 में:

name="Ricardo"
read -e -i "$name" -p "Please enter your name: " input
name="${input:-$name}"

यह इस तरह से संकेत के बाद नाम प्रदर्शित करता है:

Please enter your name: Ricardo

नाम के अंत में कर्सर के साथ और उपयोगकर्ता को इसे संपादित करने की अनुमति देता है। अंतिम पंक्ति वैकल्पिक है और नाम को मूल डिफ़ॉल्ट होने के लिए बाध्य करता है यदि उपयोगकर्ता इनपुट या डिफ़ॉल्ट को मिटा देता है (एक नल प्रस्तुत करना)।


Bash4 का उपयोग नहीं कर सकते क्योंकि यह डेबियन वितरण में गैर मानक है। मुझे कुछ ऐसा चाहिए जो बिना किसी परेशानी के काम करे।
रिकार्डो मैरिमोन

1
कोई कोड की अंतिम पंक्ति के लिए की जरूरत है, बस का उपयोग nameकरने के बजाय inputमें readआदेश।
आरएनए

1
@RNAer: अतिरिक्त चर का उपयोग करके, $nameयदि उपयोगकर्ता प्रस्तावित मूल्य को हटाता है (और इस प्रकार एक शून्य स्ट्रिंग इनपुट करता है) का मान संरक्षित है। यह सब इस बात पर निर्भर करता है कि आपकी जरूरत क्या है। मैंने अपने उत्तर में उतना ही कहा। आप सही कह रहे हैं, हालांकि, मैं और अधिक स्पष्ट हो सकता था और कहा कि यदि वैकल्पिक लाइन का उपयोग नहीं किया जाता तो चर हो सकता था name
अगली सूचना तक रोक दिया गया।

1
@ डेनिसविलियम्सन: आप सही कह रहे हैं। यह एक अच्छा अभ्यास है अगर ऐसा है जो एक चाहता है।
RNA

16

कोड:

IN_PATH_DEFAULT="/tmp/input.txt"
read -p "Please enter IN_PATH [$IN_PATH_DEFAULT]: " IN_PATH
IN_PATH="${IN_PATH:-$IN_PATH_DEFAULT}"

OUT_PATH_DEFAULT="/tmp/output.txt"
read -p "Please enter OUT_PATH [$OUT_PATH_DEFAULT]: " OUT_PATH
OUT_PATH="${OUT_PATH:-$OUT_PATH_DEFAULT}"

echo "Input: $IN_PATH Output: $OUT_PATH"

नमूना रन:

Please enter IN_PATH [/tmp/input.txt]: 
Please enter OUT_PATH [/tmp/output.txt]: ~/out.txt
Input: /tmp/input.txt Output: ~/out.txt

मुझे यह पसंद है क्योंकि यह उस कन्वेंशन का अनुसरण करता है जिसे मैं बहुत सी शेल स्क्रिप्ट में देखता हूं जहां डिफ़ॉल्ट मान कोलन से पहले वर्ग कोष्ठक में है। धन्यवाद!!!
मोरिहाटिक

16

मुझे यह प्रश्न मिला, कुछ पेश करने का तरीका ढूंढ रहा हूं:

Something interesting happened.  Proceed [Y/n/q]:

उपरोक्त उदाहरणों का उपयोग करके मैंने इसे घटाया: -

echo -n "Something interesting happened.  "
DEFAULT="y"
read -e -p "Proceed [Y/n/q]:" PROCEED
# adopt the default, if 'enter' given
PROCEED="${PROCEED:-${DEFAULT}}"
# change to lower case to simplify following if
PROCEED="${PROCEED,,}"
# condition for specific letter
if [ "${PROCEED}" == "q" ] ; then
  echo "Quitting"
  exit
# condition for non specific letter (ie anything other than q/y)
# if you want to have the active 'y' code in the last section
elif [ "${PROCEED}" != "y" ] ; then
  echo "Not Proceeding"
else
  echo "Proceeding"
  # do proceeding code in here
fi

आशा है कि किसी को तर्क को सोचने की ज़रूरत नहीं है, अगर वे एक ही समस्या का सामना करते हैं


बहुत अच्छा। यह भी सवाल को दोहराने के लिए थोड़ा सुधार किया जा सकता है अगर कोई बस "के" या कुछ और दिए गए विकल्पों की तुलना में प्रवेश करता है।
एरिकबवर्क 12

1
मैंने सिर्फ एक खरोंच के बाद यह टिप्पणी लिखी थी। अब मेरे पास एक शेल फ़ंक्शन है, जिसमें उपरोक्त शामिल है, और मैं इसका उपयोग करता हूं। शैल अच्छी तरह से लूप नहीं लगता है, इसलिए मैं इससे बचने की कोशिश करता हूं। मैं अपने फ़ंक्शन से परिणाम का परीक्षण कर सकता हूं, और एक और कोशिश कर सकता हूं, लेकिन मूल रूप से, मैं व्यवस्थापक उपकरण लिख रहा हूं जहां चीजें गलत हो सकती हैं, इसलिए मैं चाहता हूं कि व्यवस्थापक किसी भी बिंदु पर स्क्रिप्ट को सफाई से रोकने में सक्षम हो।
सिबज

11

मैंने इस पैटर्न का उपयोग किया है, जिसे मैं पसंद करता हूं:

read name || name='(nobody)'

6
name=Ricardo
echo "Please enter your name: $name \c"
read newname
[ -n "$newname" ] && name=$newname

डिफ़ॉल्ट सेट करें; इसे छापो; एक नया मूल्य पढ़ें; यदि कोई नया मान है, तो इसे डिफ़ॉल्ट के स्थान पर उपयोग करें। एक संकेत के अंत में एक नई रेखा को दबाने के तरीके पर गोले और सिस्टम के बीच कुछ बदलाव (या था) है। '\ C' संकेतन MacOS X 10.6.3 पर 3.x बैश के साथ काम करता है, और सिस्टम वी से प्राप्त यूनिक्स के अधिकांश वेरिएंट पर काम करता है, जिसमें बॉर्न या कॉर्न के गोले का उपयोग किया जाता है।

यह भी ध्यान दें कि उपयोगकर्ता को शायद एहसास नहीं होगा कि पर्दे के पीछे क्या चल रहा है; स्क्रीन पर नाम के बाद उनका नया डेटा दर्ज किया जाएगा। इसे प्रारूपित करना बेहतर हो सकता है:

echo "Please enter your name ($name): \c"

printfसे अधिक पोर्टेबल हैecho
ghostdog74

3
@ भूतडोग74: शायद; हममें से जिन्होंने 25 साल पहले शेल प्रोग्रामिंग सीखी थी, उनके लिए यह कठिन समय है कि हमारी कौन सी प्रथा अभी भी प्रासंगिक है। यह तेजी से लग रहा है जैसे बैश ने सब कुछ के बारे में फिर से लिखा है। मुझे पता है कि प्रिंटफ़ एक कमांड के रूप में थोड़ी देर के लिए रहा है - मैं शायद ही कभी इसका उपयोग करता हूं, हालांकि (शायद - कभी नहीं?)। मुझे लगता है कि मुझे शेल पर तब तक चुप रहना चाहिए जब तक कि मैंने सीखा (बैश) नहीं हो गया। 'तीस मजेदार; सॉफ्टवेयर पर काम मैं खोल स्क्रिप्ट है कि अच्छी तरह से काम नहीं करता है - लेकिन परेशानी नहीं है इस्-इस्स। मैं सिर्फ ' if (test -z "$xxx"); ...' और अन्य सी शेल्फ़ फिक्सिंग से तंग आ गया हूं।
जोनाथन लेफ़लर

मैं चकित हूँ कि बैश समर्थन करता है \c, क्योंकि यह भी समर्थन करता है echo -n! हालांकि, आपको -eपलायन की व्याख्या करने के लिए बैश की गूंज पाने के लिए जोड़ना होगा। मुझे लगता \cहै कि बेकार की चीजों के लिए है:echo -e "Syntax slightly off\c, but I've learned so much from what you've shared. Thanks, @JonathanLeffler!"
jpaugh

1
#Script for calculating various values in MB
echo "Please enter some input: "
read input_variable
echo $input_variable | awk '{ foo = $1 / 1024 / 1024 ; print foo "MB" }'

3
कृपया अपने उत्तर में स्पष्टीकरण जोड़ें।
सूफियान घोरी

-1

-E और -t पैरामीटर एक साथ काम नहीं करता है। मैंने कुछ अभिव्यक्ति की कोशिश की और परिणाम निम्न कोड स्निपेट था:

QMESSAGE="SHOULD I DO YES OR NO"
YMESSAGE="I DO"
NMESSAGE="I DO NOT"
FMESSAGE="PLEASE ENTER Y or N"
COUNTDOWN=2
DEFAULTVALUE=n
#----------------------------------------------------------------#
function REQUEST ()
{
read -n1 -t$COUNTDOWN -p "$QMESSAGE ? Y/N " INPUT
    INPUT=${INPUT:-$DEFAULTVALUE}
    if  [ "$INPUT" = "y" -o "$INPUT" = "Y" ] ;then
        echo -e "\n$YMESSAGE\n"
        #COMMANDEXECUTION
    elif    [ "$INPUT" = "n" -o "$INPUT" = "N" ] ;then
        echo -e "\n$NMESSAGE\n"
        #COMMANDEXECUTION
    else
        echo -e "\n$FMESSAGE\n"
    REQUEST
    fi
}
REQUEST

आपका जवाब सवाल के साथ ज्यादा नहीं है, है? ...
gniourf_gniourf

-E और -t पैरामीटर का उपयोग करने के लिए इसका एक काम है। यह कोडलाइन (-ई और -ई डिफ़ॉल्ट मान के लिए): -e -p "अपना नाम दर्ज करें:" -i "रिकार्डो" नाम एक उलटी गिनती (-t) के साथ काम नहीं करता है
speefak

हाँ, लेकिन यह सवाल में नहीं पूछा गया है, क्या यह है?
गनीउरफ_ग्निउरफ

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