जवाबों:
वह चेक जो $1
खाली है, हालांकि इसे उद्धृत किया जाना चाहिए (समान [ -z "$1" ]
)। कुछ बहुत पुराने गोले खाली तारों को ठीक से संभाल नहीं पाए, इसलिए पोर्टेबल स्क्रिप्ट के लेखकों ने जाँच की इस शैली को अपनाया। यह दशकों से आवश्यक नहीं है, लेकिन लोग अभी भी इसे इस तरह से करते हैं क्योंकि लोग अभी भी इसे इस तरह से करते हैं।
[ x$1 = x ]
अभी भी गलत है, लेकिन [ "x$1" = x ]
गोले एक मुद्दा जहां है के लिए होगा $1
है !
या (
या -n
.... [ "" = "$1" ]
और case $1 in "")
भी ठीक है, हालांकि होगा।
[ -z "$1" ]
और [ "$1" = "" ]
अभी भी सोलारिस 10 के / बिन / श के साथ काम नहीं करते हैं, जो डैश-0.5.4 के साथ पूर्व में है।
[ "$1" = "" ]
अभी भी इसके साथ काम नहीं करता है /bin/sh
(हालांकि आप /usr/xpg4/bin/sh
वहां उपयोग करना चाहते हैं , नहीं /bin/sh
)। जनवरी 2009 में उस संबंध में डैश तय किया गया था।
वर्ग कोष्ठक एक परीक्षण को इंगित करता है , इसलिए [ x$1 = x]
बिना if
या कुछ समान अर्थहीन है, हालांकि वाक्यविन्यास ठीक है।
इसका मतलब यह है कि यदि सही x$1
है x
, और अन्यथा गलत है, लेकिन इसका सही मूल्यांकन करने के लिए मूल्यांकन करना है , लेकिन अगर $1
(जैसे) "हे x", शेल देखेंगे x = x
, तो यह निर्माण अभी भी सुरक्षित नहीं है।
x = x
चेक का उद्देश्य यह निर्धारित करना है कि एक चर खाली है या नहीं। ऐसा करने का एक अधिक सामान्य तरीका सिर्फ उद्धरणों का उपयोग करना होगा:
if [ "$1" = "" ]; then
बैश परीक्षण ऑपरेटरों -z
और -n
भी इस्तेमाल किया जा सकता है, लेकिन वे अन्य प्रकार के गोले के लिए कम पोर्टेबल हैं। 1
उद्धरणों का कारण, या यह x$1
है कि बाएं हाथ की ओर कुछ भी विस्तार नहीं होता है, जो एक वाक्यविन्यास त्रुटि होगी:
if [ = x ] # No good!
if [ "" = "" ] # Okay.
if [ x = x ] # Also okay.
1. वास्तव में, test
स्टैंडअलोन उपयोगिता हो सकती है लेकिन अधिकांश गोले इसे अंतर्निहित के रूप में लागू करते हैं; which test
और के बीच अंतर की जाँच करें type test
। जीएनयू / लिनक्स man test
में अंतर्निहित का उल्लेख करने का दावा किया गया है, लेकिन अगर आप कॉल करते हैं (जैसे) /usr/bin/test
, तो यह सुविधा मैन पेज में शामिल सुविधाओं को लागू करने के लिए लगती है, जिसमें शामिल हैं -z
और -n
।
[ x$1 = x ]
$1
उदाहरण के लिए यदि सही है तो इसका मूल्यांकन भी करेंगे " -o x"
। कोशिश करो sh -xc '[ x$1 = x ] && echo yes' sh ' -o x'
। [ x$1 = x ]
गलत है और इसका कोई मतलब नहीं है।
if
उपयोग करने के लिए test
, इससे पहले कि आप उपयोग कर सकते हैं &&
, ||
या के बाद while
या का उपयोग कर परिणाम की जांच$?
[ x$1 = x ]
केवल समझ में आता है zsh
। यह x
स्क्रिप्ट के पहले तर्क के साथ समवर्ती की तुलना करता है x
। [
यदि $1
खाली है या प्रदान नहीं किया गया है तो कमांड सही है।
[ $1 = "" ]
काम करते हैं, क्योंकि में नहीं चाहेंगे zsh
एक खाली चर सूची संदर्भों में उद्धृत नहीं किया जाता है, यह एक खाली तर्क के बजाय सभी में कोई तर्क के लिए विस्तारित, इसलिए यदि $1
सेट नहीं है या खाली थे, [
आदेश केवल तर्क के रूप में प्राप्त होगा [
, =
, खाली स्ट्रिंग और ]
जो इसे समझ नहीं सका। [ -z "$1" ]
या [ "$1" = "" ]
POSIX गोले की तरह ठीक होगा।
बॉर्न-जैसी / पोसिक्स गोले में, [ x$1 = x ]
कोई मतलब नहीं है। यह स्प्लिट + ग्लोब ऑपरेटर किसी तरह x
स्क्रिप्ट के पहले तर्क पर लागू होता है और यह उम्मीद करता है कि परिणाम =
और x
, और कमांड के ]
लिए एक वैध परीक्षण अभिव्यक्ति है [
।
उदाहरण के लिए, अगर स्क्रिप्ट एक पारित किया गया था " = x -o x ="
तर्क, [
उन तर्कों प्राप्त होगा: [
, x
, =
, x
, -o
, x
, =
, x
, ]
, जो [
की तुलना के रूप में समझना होगा x
साथ x
और x
साथ x
और सच लौट आते हैं।
यदि $1
थे "* *"
, तो शेल [
वर्तमान निर्देशिका में उन फाइलों की सूची को कमांड को पारित करेगा, जिनका नाम x
(ग्लोब विस्तार x*
) के साथ शुरू होता है , तो गैर-छिपी हुई फाइलों की सूची (विस्तार *
) ... जो [
सक्षम होने की संभावना नहीं है किसी भी तरह से बाहर निकालने के लिए। केवल ऐसे मामले जहां कुछ भी समझदार होगा अगर $1
वाइल्डकार्ड या रिक्त वर्ण नहीं हैं।
अब, जो आपको कभी-कभी मिलता है, वह है कोड:
[ "x$1" = x ]
इसका उपयोग यह जांचने के लिए किया जाता है कि $1
क्या खाली या परेशान है।
खाली या परेशान चर के लिए परीक्षण करने का सामान्य तरीका है:
[ -z "$1" ]
लेकिन यह कुछ (गैर-पॉसिक्स) कार्यान्वयनों के कुछ मूल्यों के लिए विफल रहता है $1
जैसे कि बॉर्न शेल में बिलियन एक जैसा सोलारिस 10 और उससे पहले या कुछ पुराने संस्करणों में (0.5.4 तक) या कुछ बीएसडी के लिए।=
[
/bin/sh
dash
sh
ऐसा इसलिए है क्योंकि है [
देखता है [
, -z
, =
, ]
और करने के लिए तर्क लापता के बारे में शिकायत =
द्विआधारी ऑपरेटर के बजाय इसे समझने के रूप में -z
एकल ऑपरेटर के लिए आवेदन किया =
स्ट्रिंग।
इसी तरह, अगर है या तो [ "$1" = "" ]
कुछ कार्यान्वयन के लिए विफल रहता है ।[
$1
!
(
उन शेल / [
कार्यान्वयनों में:
[ "x$1" = x ]
मूल्य की परवाह किए बिना हमेशा एक वैध परीक्षण है $1
, इसलिए हैं:
[ "" = "$1" ]
तथा:
[ -z "${1:+x}" ]
तथा
case $1 in "") ...; esac
बेशक, अगर आप जांचना चाहते हैं कि कोई तर्क प्रदान नहीं किया गया है, तो आप करेंगे:
[ "$#" -eq 0 ]
यही है, आप स्क्रिप्ट में पास किए गए तर्कों की संख्या की जांच करते हैं।
ध्यान दें कि आजकल, [ -z "$var" ]
स्पष्ट रूप से POSIX द्वारा निर्दिष्ट किया जाता है और अधिक से अधिक अनुरूप में असफल नहीं हो सकता [
कार्यान्वयन (और bash
की [
है और दशकों के लिए किया गया है)। इसलिए आपको पोसिक्स श या bash
स्क्रिप्ट पर भरोसा करने में सक्षम होना चाहिए ।
x$1
दो स्ट्रिंग श्रृंखलाबद्ध है x
और $1
और अगर $ 1 खाली है, $ 1 x एक्स के बराबर होती है, और [x $ 1 = x] एक परिणाम के रूप में सच हो जाएगा। x = y
श में स्ट्रिंग की तुलना करने के लिए उपयोग किया जाता है
x$1
उद्धृत नहीं किया जाता है, इसलिए उन पर विभाजन और ग्लोबिंग किया जाता है।
[ x$1 = x ]
सच है अगर $1
परेशान / अशक्त / खाली है या नहीं।
अपने आप से प्रयास करें:
TEST= ;[ x$TEST = x] && echo "TEST is unset"
और
TEST=lolz ;[ x$TEST = x ] && echo "TEST is unset"
[ x$1 = x ]
यह भी सच है अगर $1
उदाहरण के लिए है " -o x"
। कोशिश करो sh -xc '[ x$1 = x ] && echo yes' sh ' -o x'
। [ x$1 = x ]
गलत है और इसका कोई मतलब नहीं है।