bash बैश खोल स्क्रिप्ट में इनपुट तर्क के अस्तित्व की जांच करें




shell (7)

प्रयत्न:

 #!/bin/bash
 if [ "$#" -eq  "0" ]
   then
     echo "No arguments supplied"
 else
     echo "Hello world"
 fi

मुझे इनपुट तर्क के अस्तित्व की जांच करने की आवश्यकता है। मेरे पास निम्न स्क्रिप्ट है:

if [ "$1" -gt "-1" ]
  then echo hi
fi

मुझे मिला

[: : integer expression expected

यह देखने के लिए कि क्या यह मौजूद है, मैं पहले इनपुट तर्क 1 को कैसे देखूं?


यदि आप केवल यह जानने में रुचि रखते हैं कि कोई विशेष तर्क गुम है, पैरामीटर प्रतिस्थापन महान है:

#!/bin/bash
# usage-message.sh

: ${1?"Usage: $0 ARGUMENT"}
#  Script exits here if command-line parameter absent,
#+ with following error message.
#    usage-message.sh: 1: Usage: usage-message.sh ARGUMENT

कुछ मामलों में आपको यह जांचने की आवश्यकता है कि क्या उपयोगकर्ता स्क्रिप्ट को तर्क दे रहा है और यदि नहीं, तो डिफ़ॉल्ट मान पर वापस आना चाहिए। नीचे लिपि में पसंद है:

scale=${2:-1}
emulator @$1 -scale $scale

यहां यदि उपयोगकर्ता दूसरे पैरामीटर के रूप में scale पास नहीं किया है, तो मैं एंड्रॉइड एमुलेटर को डिफ़ॉल्ट रूप से -scale 1 साथ लॉन्च करता हूं। ${varname:-word} एक विस्तार ऑपरेटर है। अन्य विस्तार ऑपरेटर भी हैं:

  • ${varname:=word} जो word मान वापस करने के बजाय अपरिभाषित varname सेट करता है;
  • ${varname:?message} जो या तो varname लौटाता है यदि यह परिभाषित किया गया है और यह शून्य नहीं है या message प्रिंट करता है और स्क्रिप्ट को बंद करता है (पहले उदाहरण की तरह);
  • ${varname:+word} जो word केवल तभी देता word जब varname परिभाषित किया गया हो और शून्य न हो; अन्यथा शून्य वापस आती है।

स्क्रिप्ट को तर्क पारित किए जाने का पता लगाने का एक और तरीका:

((!$#)) && echo No arguments supplied!

ध्यान दें कि (( expr )) शैल अंकगणितीय के नियमों के अनुसार अभिव्यक्ति का मूल्यांकन करने का कारण बनता है।

किसी भी तर्क की अनुपस्थिति में बाहर निकलने के लिए, कोई कह सकता है:

((!$#)) && echo No arguments supplied! && exit 1

उपर्युक्त कहने का एक और (समान) तरीका होगा:

let $# || echo No arguments supplied

let $# || { echo No arguments supplied; exit 1; }  # Exit if no arguments!

help let हैं help let :

let: let arg [arg ...]

  Evaluate arithmetic expressions.

  ...

  Exit Status:
  If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.

एक छोटे अनुस्मारक के रूप में, बैश में संख्यात्मक परीक्षण ऑपरेटर केवल पूर्णांक ( -eq , -lt , -ge , आदि) पर काम करते हैं।

मुझे यह सुनिश्चित करना अच्छा लगता है कि मेरे $ vars इनट्स हैं

var=$(( var + 0 ))

परीक्षण करने से पहले, बस "[: पूर्णांक तर्क आवश्यक" त्रुटि के खिलाफ बचाव करने के लिए।


यदि आप यह जांचना चाहते हैं कि तर्क मौजूद है या नहीं, तो आप जांच सकते हैं कि # तर्क आपके लक्ष्य तर्क संख्या से अधिक या उसके बराबर हैं या नहीं।

निम्नलिखित लिपि दर्शाती है कि यह कैसे काम करता है

test.sh

#!/usr/bin/env bash

if [ $# -ge 3 ]
then
  echo script has at least 3 arguments
fi

निम्नलिखित आउटपुट पैदा करता है

$ ./test.sh
~
$ ./test.sh 1
~
$ ./test.sh 1 2
~
$ ./test.sh 1 2 3
script has at least 3 arguments
$ ./test.sh 1 2 3 4
script has at least 3 arguments

मैं अक्सर सरल स्क्रिप्ट के लिए इस स्निपेट का उपयोग करता हूं:

#!/bin/bash

if [ -z "$1" ]; then
    echo -e "\nPlease call '$0 <argument>' to run this command!\n"
    exit 1
fi

यह है:

if [ $# -eq 0 ]
  then
    echo "No arguments supplied"
fi

$# चर आपको स्क्रिप्ट पारित इनपुट तर्कों की संख्या बताएगा।

या आप जांच सकते हैं कि कोई तर्क एक खाली स्ट्रिंग है या नहीं:

if [ -z "$1" ]
  then
    echo "No argument supplied"
fi

-z स्विच परीक्षण करेगा यदि "$ 1" का विस्तार एक शून्य स्ट्रिंग है या नहीं। यदि यह एक शून्य स्ट्रिंग है तो शरीर को निष्पादित किया जाता है।





shell