echo
जब cat /etc/passwd | grep "sysa"
सच नहीं है तो मुझे आज्ञा दी जाएगी ।
मैं क्या गलत कर रहा हूं?
if ! [ $(cat /etc/passwd | grep "sysa") ]; then
echo "ERROR - The user sysa could not be looked up"
exit 2
fi
echo
जब cat /etc/passwd | grep "sysa"
सच नहीं है तो मुझे आज्ञा दी जाएगी ।
मैं क्या गलत कर रहा हूं?
if ! [ $(cat /etc/passwd | grep "sysa") ]; then
echo "ERROR - The user sysa could not be looked up"
exit 2
fi
जवाबों:
प्रयत्न
if ! grep -q sysa /etc/passwd ; then
grep
true
यदि यह खोज लक्ष्य पाता है, और false
यदि ऐसा नहीं करता है तो रिटर्न ।
तो false
== नहीं true
।
if
गोले का मूल्यांकन बहुत ही लचीले ढंग से किया जाता है, और कई बार कमांड की श्रृंखलाओं की आवश्यकता नहीं होती है (जैसा कि आपने लिखा है)।
इसके अलावा, अपने कोड को देखने के रूप में, $( ... )
cmd- प्रतिस्थापन के रूप में आपके उपयोग की प्रशंसा की जानी है, लेकिन इस बारे में सोचें कि प्रक्रिया से क्या निकल रहा है। echo $(cat /etc/passwd | grep "sysa")
मेरा मतलब देखने की कोशिश करो । आप आगे -c
(गिनती) विकल्प को grep का उपयोग करके ले सकते हैं और फिर वह कर सकते हैं if ! [ $(grep -c "sysa" /etc/passwd) -eq 0 ] ; then
जो काम करता है, बल्कि पुराना स्कूल है।
लेकिन, आप नवीनतम शेल विशेषताओं (अंकगणितीय मूल्यांकन) का उपयोग कर सकते हैं
if ! (( $(grep -c "sysa" /etc/passwd) == 0 )) ; then ...`
जो आपको सी-लैंग आधारित तुलना ऑपरेटरों का उपयोग करने का लाभ देता है, ==,<,>,>=,<=,%
और शायद कुछ अन्य।
इस मामले में, ऑरवेलोफाइल की एक टिप्पणी के अनुसार, अंकगणितीय मूल्यांकन को और भी आगे बढ़ाया जा सकता है, जैसे
if ! (( $(grep -c "sysa" /etc/passwd) )) ; then ....
या
if (( ! $(grep -c "sysa" /etc/passwd) )) ; then ....
अंत में, वहाँ एक पुरस्कार कहा जाता है Useless Use of Cat (UUOC)
। :-) कुछ लोग उछल कर नीचे गिरेंगे और रोएंगे! मैं सिर्फ इतना कहूंगा कि grep
इसकी cmd- लाइन पर एक फ़ाइल का नाम लिया जा सकता है, इसलिए जब आपके पास नहीं है तो अतिरिक्त प्रक्रियाओं और पाइप निर्माणों को क्यों आमंत्रित करें? ;-)
आशा है कि ये आपकी मदद करेगा।
grep "^$user:" /etc/passwd
को खोजने के लिए अधिक सही तरीका होगा / etc / passwd को आकस्मिक रूप से - grep -v
जहां -v खोज खोज करता है यदि आप चाहते थे की गंदगी से बचने के लिए ||
(( $( cat file | grep regex | wc -l ) ? 0 : 1 ))
मुझे लगता है कि इसे सरल बनाया जा सकता है:
grep sysa /etc/passwd || {
echo "ERROR - The user sysa could not be looked up"
exit 2
}
या एक कमांड लाइन में
$ grep sysa /etc/passwd || { echo "ERROR - The user sysa could not be looked up"; exit 2; }
1>&2
अपने अंत में जोड़ने के बारे में क्या ? echo
stderr
!: not found
'grep
इस तरह का उपयोग करते समय आउटपुट पुनर्निर्देशन से बचें । -q
उत्पादन को दबा देता है।
मैं क्या गलत कर रहा हूं?
$(...)
मान रखता है , निकास की स्थिति नहीं, यही कारण है कि यह दृष्टिकोण गलत है। हालांकि, इस विशिष्ट मामले में, यह वास्तव में काम करता है क्योंकि sysa
मुद्रित किया जाएगा जो परीक्षण के बयान को सच बनाता है। हालाँकि, if ! [ $(true) ]; then echo false; fi
हमेशा प्रिंट होगा false
क्योंकि true
कमांड stdout को कुछ भी नहीं लिखता (भले ही निकास कोड 0 है)। इसीलिए इसे फिर से परिभाषित करने की आवश्यकता है if ! grep ...; then
।
एक विकल्प होगा cat /etc/passwd | grep "sysa" || echo error
। संपादित करें: एलेक्स के रूप में बताया, बिल्ली यहाँ बेकार है : grep "sysa" /etc/passwd || echo error
।
भ्रामक होने के बजाय अन्य उत्तर मिले, आशा है कि इससे किसी को मदद मिलेगी।
यूनिक्स सिस्टम पर जो इसका समर्थन करता है (ऐसा लगता है कि macOS नहीं):
if getent passwd "$username" >/dev/null; then
printf 'User %s exists\n' "$username"
else
printf 'User %s does not exist\n' "$username"
fi
इसका यह लाभ है कि यह किसी भी निर्देशिका सेवा का उपयोग करेगा जो (YP / NIS या LDAP आदि) और स्थानीय डेटाबेस डेटाबेस फ़ाइल में हो सकती है।
इसके साथ मुद्दा grep -q "$username" /etc/passwd
यह है कि यह एक गलत पॉजिटिव देगा जब ऐसा कोई उपयोगकर्ता नहीं है, लेकिन कुछ और पैटर्न से मेल खाता है। यह तब हो सकता है जब फ़ाइल में कहीं और आंशिक या सटीक मिलान हो।
उदाहरण के लिए, मेरी passwd
फाइल में, एक लाइन है
build:*:21:21:base and xenocara build:/var/empty:/bin/ksh
यह चीजों cara
और चीजों पर एक वैध मैच को उकसाएगा enoc
, भले ही मेरे सिस्टम पर ऐसे उपयोगकर्ता नहीं हैं।
एक के लिए grep
समाधान सही होने के लिए, आप ठीक ढंग से पार्स करने के लिए की आवश्यकता होगी /etc/passwd
फ़ाइल:
if cut -d ':' -f 1 /etc/passwd | grep -qxF "$username"; then
# found
else
# not found
fi
... या किसी अन्य इसी तरह के परीक्षण के खिलाफ :
-delilized क्षेत्रों के पहले ।
bash
उस स्थिति में निष्पादित नहीं होता है।
यहाँ उदाहरण के माध्यम से एक जवाब है:
यह सुनिश्चित करने के लिए कि डेटा लॉगर्स ऑनलाइन हैं एक cron
स्क्रिप्ट हर 15 मिनट में चलती है जो इस तरह दिखती है:
#!/bin/bash
#
if ! ping -c 1 SOLAR &>/dev/null
then
echo "SUBJECT: SOLAR is not responding to ping" | ssmtp abc@def.com
echo "SOLAR is not responding to ping" | ssmtp 4151112222@txt.att.com
else
echo "SOLAR is up"
fi
#
if ! ping -c 1 OUTSIDE &>/dev/null
then
echo "SUBJECT: OUTSIDE is not responding to ping" | ssmtp abc@def.com
echo "OUTSIDE is not responding to ping" | ssmtp 4151112222@txt.att.com
else
echo "OUTSIDE is up"
fi
#
... और इतने पर प्रत्येक डेटा लकड़हारा है कि आप http://www.SDsolarBlog.com/montage में असेंबल में देख सकते हैं
FYI करें, &>/dev/null
कमांड से सभी आउटपुट को रीडायरेक्ट करता है, त्रुटियों सहित, को/dev/null
(केवल सशर्त को आदेश exit status
की आवश्यकता है ping
)
FYI करें, ध्यान दें कि चूंकि cron
नौकरियां चलती हैं, root
इसलिए स्क्रिप्ट sudo ping
में उपयोग करने की कोई आवश्यकता नहीं है cron
।
!
कोष्ठक के अंदर नहीं होना चाहिए ? यानी[ ! EXPR ]