मुझे एक इनपुट तर्क के अस्तित्व की जांच करने की आवश्यकता है। मेरे पास निम्न स्क्रिप्ट है
if [ "$1" -gt "-1" ]
then echo hi
fi
मुझे मिला
[: : integer expression expected
मैं इनपुट तर्क 1 की जांच कैसे करूं कि यह मौजूद है या नहीं?
मुझे एक इनपुट तर्क के अस्तित्व की जांच करने की आवश्यकता है। मेरे पास निम्न स्क्रिप्ट है
if [ "$1" -gt "-1" ]
then echo hi
fi
मुझे मिला
[: : integer expression expected
मैं इनपुट तर्क 1 की जांच कैसे करूं कि यह मौजूद है या नहीं?
जवाबों:
यह है:
if [ $# -eq 0 ]
then
echo "No arguments supplied"
fi
$#
चर आप इनपुट तर्क स्क्रिप्ट पारित किया गया था की संख्या पता चलेगी।
या आप जांच सकते हैं कि कोई तर्क एक रिक्त स्ट्रिंग है या नहीं:
if [ -z "$1" ]
then
echo "No argument supplied"
fi
-z
यदि "$ 1" के विस्तार के एक रिक्त स्ट्रिंग है या नहीं स्विच परीक्षण किया जाएगा। यदि यह एक अशक्त स्ट्रिंग है तो शरीर को निष्पादित किया जाता है।
exit 1
स्क्रिप्ट को कार्य करने के लिए तर्क की आवश्यकता होने पर ब्लॉक के अंदर अपने इको के अंत में जोड़ना चाहते हैं । स्पष्ट है, लेकिन पूर्णता के लिए ध्यान देने योग्य है।
programname "" secondarg third
। $#
जांच स्पष्ट तर्क की संख्या की जांच करता है।
if [ ! -z "$1" ]; then ...
इस तरह से प्रदर्शन करना बेहतर है
if [[ $# -eq 0 ]] ; then
echo 'some message'
exit 1
fi
यदि आपके पास बहुत कम तर्क हैं, तो आपको आमतौर पर बाहर निकलने की आवश्यकता है।
exit 1
जो आप आमतौर पर चाहते हैं, और [[ ]]
परीक्षण का उपयोग करता है जो (iirc) आमतौर पर अधिक उचित होता है। तो लोगों के लिए नेत्रहीन कॉपी-पेस्टिंग कोड यह बेहतर जवाब है।
कुछ मामलों में आपको यह जांचने की आवश्यकता है कि क्या उपयोगकर्ता ने स्क्रिप्ट में एक तर्क पारित किया है और यदि नहीं, तो एक डिफ़ॉल्ट मान पर वापस गिर जाता है। नीचे दी गई स्क्रिप्ट की तरह:
scale=${2:-1}
emulator @$1 -scale $scale
अगर उपयोगकर्ता scale
2 पैरामीटर के रूप में पारित नहीं हुआ है , तो मैं -scale 1
डिफ़ॉल्ट रूप से एंड्रॉइड एमुलेटर लॉन्च करता हूं । ${varname:-word}
एक विस्तार ऑपरेटर है। अन्य विस्तार ऑपरेटर भी हैं:
${varname:=word}
जो मान वापस करने के बजाय अपरिभाषित सेट करता है ;varname
word
${varname:?message}
जो या तो varname
परिभाषित करता है और अगर यह परिभाषित नहीं है या वापस नहीं आता है message
और स्क्रिप्ट को निरस्त करता है (पहले उदाहरण की तरह);${varname:+word}
जो परिभाषित होने पर word
ही वापस आता varname
है और अशक्त नहीं है; अन्यथा अशक्त।${varname?message}
। क्या अतिरिक्त :
टाइपो है, या क्या यह व्यवहार को बदलता है?
: ${1?"First argument is null"} ${2?"Please provide more than 1 argument"}
प्रयत्न:
#!/bin/bash
if [ "$#" -eq "0" ]
then
echo "No arguments supplied"
else
echo "Hello world"
fi
$#
और के लिए दोहरे उद्धरण चिह्नों की आवश्यकता क्यों है 0
?
else
भी धन्यवाद ।
foo*
) और शब्द बंटवारा (यानी यदि सामग्री में व्हाट्सएप हो तो सामग्री को विभाजित करना)। इस मामले में यह उद्धृत करना आवश्यक नहीं है $#
क्योंकि यह दोनों मामले लागू नहीं होते हैं। उद्धृत करना 0
भी आवश्यक नहीं है, लेकिन कुछ लोग मूल्यों को उद्धृत करना पसंद करते हैं क्योंकि वे वास्तव में तार हैं और इससे यह अधिक स्पष्ट होता है।
यह पता लगाने का एक और तरीका है कि क्या स्क्रिप्ट में तर्क पारित किए गए थे:
((!$#)) && 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
कहते हैं:
let: let arg [arg ...]
Evaluate arithmetic expressions. ... Exit Status: If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.
exit
जो मेरे zsh प्रक्रिया को मारता है, मैं का उपयोग करें return
जो इसे मारने नहीं करता है
((!$#))
इतिहास प्रतिस्थापन ट्रिगर होगा ?
केवल इसलिए कि मुझे इंगित करने के लिए एक और आधार बिंदु है मैं जोड़ूंगा कि आप बस अपने स्ट्रिंग का परीक्षण कर सकते हैं अशक्त है:
if [ "$1" ]; then
echo yes
else
echo no
fi
इसी तरह अगर आप उम्मीद कर रहे हैं कि arg काउंट सिर्फ आपके अंतिम परीक्षण का है:
if [ "$3" ]; then
echo has args correct or not
else
echo fixme
fi
और इतने पर किसी भी arg या var के साथ
यदि आप यह जाँचना चाहते हैं कि क्या तर्क मौजूद है, तो आप जाँच सकते हैं कि क्या तर्कों की संख्या आपके लक्ष्य तर्क संख्या से अधिक या बराबर है।
निम्न स्क्रिप्ट प्रदर्शित करता है कि यह कैसे काम करता है
#!/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
एक छोटा सा बता दें कि बैश में संख्यात्मक परीक्षण ऑपरेटरों केवल पूर्णांकों पर काम ( -eq
, -lt
,-ge
, आदि)
मुझे यह सुनिश्चित करना पसंद है कि मेरी $ वरियाँ इनसर्ट हैं
var=$(( var + 0 ))
इससे पहले कि मैं उनका परीक्षण करूं, बस "[: पूर्णांक arg आवश्यक" त्रुटि के खिलाफ बचाव करें।
var=$(printf "%.0f" "$var")
एक स्ट्रिंग दी जाने पर गैर-शून्य निकास से फ्लोट को संभाल सकता है लेकिन गैर-शून्य निकास से ग्रस्त है। यदि आपको एक अजीब बात नहीं लगती है, तो इस विधि का उपयोग मैं एक पूर्णांक को लागू करने के लिए सबसे मजबूत लगता है var=$(<<<"$var" awk '{printf "%.0f", $0}')
:। यदि var परेशान है, तो यह "0" के लिए डिफॉल्ट करता है। यदि var एक फ्लोट है, तो इसे निकटतम पूर्णांक में गोल किया जाता है। नकारात्मक मान भी उपयोग करने के लिए ठीक हैं।
एक लाइनर बैश फ़ंक्शन सत्यापन
myFunction() {
: ${1?"forgot to supply an argument"}
if [ "$1" -gt "-1" ]; then
echo hi
fi
}
फ़ंक्शन का नाम और उपयोग जोड़ें
myFunction() {
: ${1?"forgot to supply an argument ${FUNCNAME[0]}() Usage: ${FUNCNAME[0]} some_integer"}
if [ "$1" -gt "-1" ]; then
echo hi
fi
}
पूर्णांक की जाँच करने के लिए सत्यापन जोड़ें
अतिरिक्त सत्यापन जोड़ने के लिए, उदाहरण के लिए यह देखने के लिए जांच करें कि क्या तर्क एक पूर्णांक है, सत्यापन फ़ंक्शन को कॉल करने के लिए सत्यापन एक लाइनर को संशोधित करें:
: ${1?"forgot to supply an argument ${FUNCNAME[0]}() Usage: ${FUNCNAME[0]} some_integer"} && validateIntegers $1 || die "Must supply an integer!"
फिर, एक सत्यापन फ़ंक्शन का निर्माण करें जो तर्क को मान्य करता है, सफलता पर 0 वापस, 1 विफलता पर और एक फ़ंक्शन जो विफलता पर संदेश को निरस्त करता है
validateIntegers() {
if ! [[ "$1" =~ ^[0-9]+$ ]]; then
return 1 # failure
fi
return 0 #success
}
die() { echo "$*" 1>&2 ; exit 1; }
और भी सरल - बस उपयोग करें set -u
set -u
यह सुनिश्चित करता है कि प्रत्येक संदर्भित चर सेट किया जाता है जब इसका उपयोग किया जाता है, इसलिए बस इसे सेट करें और इसे भूल जाएं
myFunction() {
set -u
if [ "$1" -gt "-1" ]; then
echo hi
fi
}
[ -z "$1" ] && echo "No argument supplied"
मैं वन-लाइनर्स पसंद करता हूं, क्योंकि वे मेरे लिए आसान हैं; और इसका उपयोग करने की तुलना में निकास मूल्य की जांच करना भी तेज़ हैif