बैश स्क्रिप्ट [x $ 1 = x]


21

मैं बैश स्क्रिप्ट पढ़ रहा हूं मुझे समझ नहीं आ रहा है कि वहां क्या हो रहा है।

#!/bin/sh
[ x$1 = x ] 

दूसरी लाइन पर क्या चल रहा है और क्या [ x$1 = x ] मतलब है?

जवाबों:


27

वह चेक जो $1खाली है, हालांकि इसे उद्धृत किया जाना चाहिए (समान [ -z "$1" ])। कुछ बहुत पुराने गोले खाली तारों को ठीक से संभाल नहीं पाए, इसलिए पोर्टेबल स्क्रिप्ट के लेखकों ने जाँच की इस शैली को अपनाया। यह दशकों से आवश्यक नहीं है, लेकिन लोग अभी भी इसे इस तरह से करते हैं क्योंकि लोग अभी भी इसे इस तरह से करते हैं।


हाँ, आपको इसे इस तरह नहीं करना चाहिए और अधिक आधुनिक शैली अपनानी चाहिए। जब तक आप पीडीपी 11 पर काम नहीं कर रहे हैं।
मैकलेमन

4
यह खाली तारों के बारे में उतना नहीं है। [ x$1 = x ]अभी भी गलत है, लेकिन [ "x$1" = x ]गोले एक मुद्दा जहां है के लिए होगा $1है !या (या -n.... [ "" = "$1" ]और case $1 in "")भी ठीक है, हालांकि होगा।
स्टीफन चेज़लस

2
@ MacLemon, अब तक वापस जाने की कोई जरूरत नहीं है। [ -z "$1" ]और [ "$1" = "" ]अभी भी सोलारिस 10 के / बिन / श के साथ काम नहीं करते हैं, जो डैश-0.5.4 के साथ पूर्व में है।
स्टीफन चेज़लस

1
अंतिम वाक्य के लिए अतिरिक्त +1!
ग्लेन जैकमैन

1
@glennjackman, वह अंतिम वाक्य गलत है। सोलारिस 10 अभी भी सोलारिस का सबसे व्यापक रूप से तैनात संस्करण है और [ "$1" = "" ]अभी भी इसके साथ काम नहीं करता है /bin/sh(हालांकि आप /usr/xpg4/bin/shवहां उपयोग करना चाहते हैं , नहीं /bin/sh)। जनवरी 2009 में उस संबंध में डैश तय किया गया था।
स्टीफन चेज़लस

8

वर्ग कोष्ठक एक परीक्षण को इंगित करता है , इसलिए [ 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


1
[ x$1 = x ]$1उदाहरण के लिए यदि सही है तो इसका मूल्यांकन भी करेंगे " -o x"। कोशिश करो sh -xc '[ x$1 = x ] && echo yes' sh ' -o x'[ x$1 = x ]गलत है और इसका कोई मतलब नहीं है।
स्टीफन चेज़लस

@ स्टेफेनचैलेजस धन्यवाद SC - संपादित (दूसरा पैरा)।
गोल्डीलॉक्स

आप की जरूरत नहीं है ifउपयोग करने के लिए test, इससे पहले कि आप उपयोग कर सकते हैं &&, ||या के बाद whileया का उपयोग कर परिणाम की जांच$?
Jasen

8
[ 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/shdashsh

ऐसा इसलिए है क्योंकि है [देखता है [, -z, =, ]और करने के लिए तर्क लापता के बारे में शिकायत =द्विआधारी ऑपरेटर के बजाय इसे समझने के रूप में -zएकल ऑपरेटर के लिए आवेदन किया =स्ट्रिंग।

इसी तरह, अगर है या तो [ "$1" = "" ]कुछ कार्यान्वयन के लिए विफल रहता है ।[$1!(

उन शेल / [कार्यान्वयनों में:

[ "x$1" = x ]

मूल्य की परवाह किए बिना हमेशा एक वैध परीक्षण है $1, इसलिए हैं:

[ "" = "$1" ]

तथा:

[ -z "${1:+x}" ]

तथा

case $1 in "") ...; esac

बेशक, अगर आप जांचना चाहते हैं कि कोई तर्क प्रदान नहीं किया गया है, तो आप करेंगे:

[ "$#" -eq 0 ]

यही है, आप स्क्रिप्ट में पास किए गए तर्कों की संख्या की जांच करते हैं।

ध्यान दें कि आजकल, [ -z "$var" ]स्पष्ट रूप से POSIX द्वारा निर्दिष्ट किया जाता है और अधिक से अधिक अनुरूप में असफल नहीं हो सकता [कार्यान्वयन (और bashकी [है और दशकों के लिए किया गया है)। इसलिए आपको पोसिक्स श या bashस्क्रिप्ट पर भरोसा करने में सक्षम होना चाहिए ।


0

x$1दो स्ट्रिंग श्रृंखलाबद्ध है xऔर $1और अगर $ 1 खाली है, $ 1 x एक्स के बराबर होती है, और [x $ 1 = x] एक परिणाम के रूप में सच हो जाएगा। x = yश में स्ट्रिंग की तुलना करने के लिए उपयोग किया जाता है


2
कोई x$1उद्धृत नहीं किया जाता है, इसलिए उन पर विभाजन और ग्लोबिंग किया जाता है।
स्टीफन चेज़लस

0

[ x$1 = x ]सच है अगर $1परेशान / अशक्त / खाली है या नहीं।
अपने आप से प्रयास करें:
TEST= ;[ x$TEST = x] && echo "TEST is unset"
और
TEST=lolz ;[ x$TEST = x ] && echo "TEST is unset"


1
[ x$1 = x ]यह भी सच है अगर $1उदाहरण के लिए है " -o x"। कोशिश करो sh -xc '[ x$1 = x ] && echo yes' sh ' -o x'[ x$1 = x ]गलत है और इसका कोई मतलब नहीं है।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.