मैं सशर्त बयान में स्क्रिप्ट से बाहर कैसे निकलूं?


50

मैं एक bash स्क्रिप्ट लिख रहा हूँ जहाँ मैं अगर उपयोगकर्ता रूट नहीं है तो बाहर निकलना चाहता हूँ। सशर्त ठीक काम करता है, लेकिन स्क्रिप्ट बाहर नहीं निकलती है।

[[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit)

मैं &&इसके बजाय का उपयोग करने की कोशिश की है, ;लेकिन न तो काम।

जवाबों:


50

आप इस तरह से कर सकते हैं:

[[ $(id -u) -eq 0 ]] || { echo >&2 "Must be root to run script"; exit 1; }

("साधारण" पहले कथन में अंकगणितीय बाइनरी ऑपरेटर के साथ सशर्त अभिव्यक्ति), या:

(( $(id -u) == 0 )) || { echo >&2 "Must be root to run script"; exit 1; }

(पहले परीक्षण के लिए अंकगणितीय मूल्यांकन)।

परिवर्तन को नोटिस करें ()-> {}- घुंघराले कोष्ठक एक उपधारा को स्पॉन नहीं करते हैं । ( man bash"सबशेल" के लिए खोजें ।)


1
कृपया शून्य के अलावा किसी अन्य कोड के साथ बाहर निकलें, उदाहरण: exit 1मूल प्रक्रिया को समझने के लिए कि एक समस्या उत्पन्न हुई।
सैमके

1
आपको [[संख्यात्मक तुलना के लिए उपयोग नहीं करना चाहिए ((
क्रिस डाउन

1
@ क्रिसडाउन [[ठीक है, जब तक आप -eqइसके बजाय का उपयोग करते हैं ==
Let_Me_Be

सशर्त फिक्स्ड, अंकगणित संस्करण @ChrisDown जोड़ा।
Mat

2
@ मैट वैसे, आप इसे छोटा कर सकते हैं(( EUID )) && ...
क्रिस डाउन

21

उन आदेशों के आसपास कोष्ठक एक सबस्क्रिप्शन बनाता है । आपके सबशेल ईकोस "स्क्रिप्ट चलाने के लिए रूट होना चाहिए" और फिर आप सब्स्क्रिप्शन को बाहर निकलने के लिए कहते हैं (हालांकि यह पहले से ही होगा, क्योंकि अधिक कमांड नहीं थे)। इसे ठीक करने का सबसे आसान तरीका शायद सिर्फ एक का उपयोग करना है if:

if [[ `id -u` != 0 ]]; then
    echo "Must be root to run script"
    exit
fi

तो वन-लाइनर के साथ ऐसा करने का कोई तरीका नहीं है?
गैरेट हॉल

1
आपका तर्क पीछे की ओर है। अपने उदाहरण में, यदि id -u == 0, मतलब होगा जो कि आप कर रहे हैं जड़। आप चाहते हैं [[ $(id -u) != 0 ]]; then
टिम कैनेडी

4
यदि आपके पास एक-लाइनर है / होना चाहिए, तो [ "$UID" != 0 ] && echo 'You have to be root.' && exit 1;इसके लिए आकार पर प्रयास करें: यह भी ध्यान दें $UID, जो एक प्रक्रिया को पैदा करने से बचाता है। मुझे लगता है कि आप भी पसंद कर सकते हैं $EUID

1
@ भजन, अच्छी बात। और जब सुबह एक अंकीय मान के साथ एक चर है: ((UID)) && echo 'You have to be root.' && exit 1
मैनटवर्क

3
@janmoesen: ध्यान दें कि इस तरह के उलटे तर्क का उपयोग set -eकरने से स्क्रिप्ट को गर्भपात करना होगा। उस समस्या का एक समाधान है [ "$UID" != 0 ] && echo 'You have to be root.' && exit 1 || true
सैम होसेवर

2

बैश के साथ :

[ $UID -ne 0 ] && echo "Must be root to run script" && exit 1

अगर echoअसफल (उदाहरण के लिए क्योंकि stdout लिखने योग्य नहीं है) से बाहर निकलना विफल होगा ।
स्टीफन चेजालस

1

कोष्ठक के चारों ओर ||और &&इन के रूप में की आवश्यकता नहीं है राइट साहचर्य हैं। निम्नलिखित दो भाव समतुल्य हैं:

expr1 || expr2 && expr3
expr1 || { expr2 && expr3 }

तो &&इसके बजाय ;सिर्फ ठीक काम echoकरेगा , जैसा कि सच होगा।

[[ $(id -u) == 0 ]] || echo "Must be root to run script" && exit 1

1
जबकि आपने जो कुछ भी कहा वह सही है, यह सीखने का एक बुरा तरीका है, क्योंकि आप expr2 के रिटर्न वैल्यू पर भरोसा कर रहे हैं। क्या आप निश्चित हैं कि प्रतिध्वनि हमेशा 0 बाहर निकलने की स्थिति में लौटेगी? घुंघराले ब्रेसिज़ और अर्ध-कॉलोन के साथ बयानों को समूहित करना बेहतर है। : इस तरह के एक आम ख़तरा है यह BashPitfalls में अपनी ही प्रविष्टि है कि mywiki.wooledge.org/BashPitfalls#cmd1_.26.26_cmd2_.7C.7C_cmd3
Flimm

1
@ फ़ीलम: मैं सहमत नहीं हूँ कि यह एक बुरा पैटर्न है। जाहिर है, यह उपयोग केस-डिपेंडेंट है, और आपके द्वारा प्राप्त किए गए रिटर्न वैल्यू के आपके ज्ञान पर भी निर्भर करता है। इस मामले में मुझे यकीन है कि प्रतिध्वनि ० ९९.९९% बार वापस आ जाएगी, और अगर यह एक लिखने की त्रुटि (केवल ऐसा नहीं होगा तो यह ० नहीं लौटेगा) इस अवधि से बड़ी समस्या है। वहाँ भी ऐसा मामला है जहाँ आप रिटर्न मान उत्पन्न कर रहे हैं, इसलिए नहीं, यह मेरे लिए प्रति "खराब पैटर्न" नहीं है।
अता

मैं भी जोड़ दूंगा, जैसे कि यह विकि में कहता है, कि सी मूल्यांकन को समझने के लिए आपको इसका उपयोग करना चाहिए। वैसे भी, थोड़ा परीक्षण किसी भी अस्पष्टता को साफ करना चाहिए।
एटा

0

यह आपको मदद कर सकता है, को कोसने में

[oracle@rac1 ~]$ which bash
/bin/bash
[oracle@rac1 ~]$ cat test1.sh
if [ `id -u` != 0 ]
then
echo "Must be root to run the script
 "
exit
fi

3
इसका उत्तर पहले ही दिया जा चुका है। साथ ही, आपका उत्तर उसी के पास है जो पहले ही पोस्ट किया जा चुका है।
Maulinglawns 10:15 बजे

@maulinglawns, उस उत्तर, अन्य लोगों के विपरीत सभी बॉर्न-जैसे गोले के पोर्टेबल होने का गुण है (यह बेहतर होगा कि त्रुटि stderr पर आउटपुट थी, बाहर निकलने की स्थिति गैर-शून्य थी और कमांड कन्वेंशन को उद्धृत किया गया था, हालांकि )
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.