सवाल `Read` कमांड को दिए गए फ़ील्ड की संख्या कैसे जांचें?


मेरे पास एक त्वरित सवाल है $# खोल स्क्रिप्ट में।

तो, मैं उपयोग कर सकते हैं $# उपयोगकर्ता द्वारा दिए गए शेल स्क्रिप्ट तर्कों की संख्या की जांच करने के लिए कमांड लाइन पर।

उदाहरण:

#  ./shellScript varONE varTWO
#  $#
>  2  <--  so output 2 here reflects varONE and varTWO

क्या कोई कमांड मैं उपयोग कर सकता हूं read आदेश?

उदाहरण के लिए:

#!/bin/bash
read -p "please input value" var1 var2
echo $#  <--  however here will return 0 even user input two values at command line

क्या कोई अन्य कमांड मैं 2 लौटने के लिए यहां उपयोग कर सकता हूं ताकि मैं उपयोगकर्ता के इनपुट चर पर एक चेक कर सकूं? पसंद:

[ $# -lt 2 ] && echo "failed"

4
2018-04-21 18:05


मूल


क्या कोई जवाब उपयोगी था? - jobin


जवाब:


यह जांचने का सबसे अच्छा तरीका है कि आपको अपना मूल्य प्राप्त हुआ है या नहीं varTWO जांचना है कि क्या varTWO निम्नानुसार खाली है:

read varONE varTWO
if [[ $varTWO = '' ]]; then
    echo "failed"
fi

4
2018-04-21 18:14



वाह बहुत - बहुत धन्यवाद!!!! - user195661
अप्रचलित अगर पहली जांच नहीं है? (अगर varTWO नहीं है तो varone कैसे हो सकता है?) - Rinzwind
@Rinzwind: varone हो सकता है जब 'कोई तर्क प्रदान नहीं किया गया है और varTWO हो सकता है' 'जब केवल एक तर्क प्रदान किया जाता है। - jobin
@Rinzwind: ओह हाँ, यकीन नहीं है कि मैं क्या सोच रहा था जबकि मैंने यह स्क्रिप्ट किया: / - jobin


विशेष शैल चर $# खोल के इस आवेदक को दिए गए स्थितित्मक तर्कों की संख्या वापस करें।

यदि आप चाहते हैं कि स्क्रिप्ट में दिए गए तर्क बिल्कुल 2 हैं:

if [ $# -ne 2 ]; then
    echo "failed" 
fi

#check if args are correct here...

0
2018-04-21 18:41



यह सवाल का जवाब कैसे देता है? - jobin
जांच करें कि क्या तर्क की संख्या है, यह जांचने की कोई आवश्यकता नहीं है कि वे शून्य हैं या नहीं। गुजरने का तर्क स्थितित्मक है, इसलिए यदि आपके पास 2 आवश्यक हैं तो वैध हैं। - girardengo


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

$ cat file
one two three four five
$ while read line; do echo "$line"; done < file
one two three four five
$ while read first second rest; do echo "First: $first, Second:$second Rest:$rest"; done < file
First: one, Second:two Rest:three four five

इसलिए, read जैसा कि आप इसे देते हैं उतने चर को पढ़ेंगे। यदि आपके पास परिवर्तनीय लंबाई इनपुट हो सकता है, तो आपको यह जानने के लिए प्रत्येक को जांचने की आवश्यकता होगी कि @ जॉबिम में बताए गए अनुसार कितने पास हुए थे उत्तर, या आप सरणी का उपयोग कर सकते हैं।

जैसा कि समझाया गया है help read:

विकल्प:

-ए सरणी सरणी के अनुक्रमिक सूचकांक को पढ़ने वाले शब्दों को असाइन करती है               शून्य से शुरू, परिवर्तनीय ARRAY

इसका मतलब यह है कि आप इनपुट मानों को सरणी में संग्रहीत कर सकते हैं और उसके बाद सरणी की लंबाई प्राप्त कर सकते हैं ${#ArrayName[@]}:

#!/usr/bin/env bash

read -a values -p "please input values: " 
echo "You gave ${#values[@]} value(s)"

0
2018-04-23 01:03