"সত্য শর্ত না হলে" কীভাবে তৈরি করবেন?


317

আমি চাই echocat /etc/passwd | grep "sysa"সত্যটি না হলে আদেশটি কার্যকর ।

আমি কি ভুল করছি?

if ! [ $(cat /etc/passwd | grep "sysa") ]; then
        echo "ERROR - The user sysa could not be looked up"
        exit 2
fi

7
!বন্ধনী ভিতরে থাকা উচিত নয়? অর্থাত্[ ! EXPR ]
acraig5075

7
@ acraig5075 এটি কোনওভাবেই বৈধ, তবে এই বিবৃতিতে মোটেই পরীক্ষার কমান্ডের (যা বন্ধনীগুলি হ'ল) ​​দরকার নেই।
চার্লস ডাফি

উত্তর:


454

চেষ্টা

if ! grep -q sysa /etc/passwd ; then

greptrueএটি অনুসন্ধান লক্ষ্য সন্ধান করে এবং falseযদি এটি না পায় তবে ফিরে আসে ।

সুতরাং নয় false== true

if শেলগুলির মূল্যায়ন খুব নমনীয় হওয়ার জন্য ডিজাইন করা হয়েছে এবং অনেক সময় কমান্ডের শৃঙ্খলার প্রয়োজন হয় না (যেমনটি আপনি লিখেছেন)।

এছাড়াও, আপনার কোডটি যেমন $( ... )রয়েছে তেমনভাবে দেখে , আপনার সিএমডি-প্রতিস্থাপনের ফর্মের ব্যবহারটি প্রশংসা করার মতো, তবে কী প্রক্রিয়াটি বেরিয়ে আসছে তা ভেবে দেখুন। echo $(cat /etc/passwd | grep "sysa")আমার অর্থ কী তা দেখার চেষ্টা করুন । -cগ্রেপ করার জন্য (গণনা) বিকল্পটি ব্যবহার করে আপনি এটিকে আরও এগিয়ে নিতে পারেন এবং তারপরেও এটি করতে পারেন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এটির সেমিডি-লাইনে কোনও ফাইলের নাম নেওয়া যেতে পারে, তাই যখন আপনার দরকার নেই তখন অতিরিক্ত প্রক্রিয়া এবং পাইপ নির্মাণের জন্য কেন অনুরোধ করবেন? ;-)

আশা করি এটা কাজে লাগবে.


1
এটা সব বরং নিরীহ সত্যিই, আমার উত্তর থেকে একটি অনেক বেশি কঠিন (প্রশ্ন) এর [এর stackoverflow.com/a/30400327/912236] grep "^$user:" /etc/passwd অনুসন্ধান করতে আরো সঠিক উপায় / হবে etc / passwd incidently - grep -vযেখানে -v অনুসন্ধান inverts যদি আপনি চেয়েছিলেন গণ্ডগোল এড়ানোর জন্য ||
ওড়ওলোফিল

1
হ্যাঁ, বেশিরভাগ দক্ষতার সাথে সমস্যা সমাধান হচ্ছে এবং তারপরে নির্দিষ্ট প্রশ্নের উত্তর দেওয়া হবে। আমি নির্দিষ্ট প্রশ্নের উত্তর দেওয়ার চেষ্টা করেছি। আপনার ধারণার জন্য ধন্যবাদ। সবার জন্য শুভ কামনা.
শেল্টার

1
আপনার উত্তরগুলি বাছাই করা নয়, সেগুলি বেশ উপভোগ করেছে। আমি কেবলমাত্র আমি ব্যবহারকারীর নামগুলিতে একটি যথাযথভাবে সীমাবদ্ধ চেক নিক্ষেপ করব, অন্যথায় যদি ওপি সত্যই "সিস" বা সামসুচ অনুসন্ধান করে, তবে তিনি চমক পেয়ে যাবেন। আর কি রাস্তার জন্য? (( $( cat file | grep regex | wc -l ) ? 0 : 1 ))
ওড়ওলোফিল

1
গ্রেট! কোনও কারণে রিক্যালিয়ানের "! গ্রেপ-কিউস ..." / প্রোক / মাউন্টগুলির সাথে কাজ করে না এবং রাস্পবিয়ান ৪.৯ কার্নেলের উপর নিয়মিত ড্রপিং ইউএসবি-ডিস্ক স্থাপন করা হয়েছে কিনা তা চেষ্টা করার চেষ্টা করে। এই এক কাজ নিখুঁতভাবে!
ডকউইয়ার্ড

33

আমি মনে করি এটি এটিকে সরল করা যেতে পারে:

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; }


4
সুন্দর, তবে আমি মিঃ শেল্টার উত্তরটি পছন্দ করি কারণ "স্ব নথিভুক্ত", প্রোগ্রামারের অভিপ্রায়টি আরও "পাঠযোগ্য"।
0zkr পিএম

1
আমি এই সংস্করণটি পছন্দ করি। 1>&2আপনার echoপ্রিন্ট করতে শেষে যুক্ত সম্পর্কে কি stderr?
জুলিয়েন

2
@ 0zkrPM তবে শেল্টার সংস্করণ বোর্ন শেলটিতে কাজ করে না। আপনি পাবেন!: not found
ceving

1
'grepএই জাতীয় ব্যবহার করার সময় আউটপুট পুনঃনির্দেশ এড়িয়ে চলুন । -qআউটপুট দমন করে।
tbc0

8

আমি কি ভুল করছি?

$(...)প্রস্থান স্থিতি নয়, মান রাখে , এই কারণেই এই পদ্ধতিরটি ভুল। যাইহোক, এই নির্দিষ্ট ক্ষেত্রে এটি কার্যকরভাবে কাজ করে কারণ 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

বিভ্রান্তিকর অন্য উত্তরগুলি খুঁজে পেয়েছি, আশা করি এটি কারও সহায়ক হবে।


1

ইউনিক্স সিস্টেমে এটি সমর্থন করে (এটি ম্যাকোস হিসাবে মনে হয় না):

if getent passwd "$username" >/dev/null; then
    printf 'User %s exists\n' "$username"
else
    printf 'User %s does not exist\n' "$username"
fi 

এটির সুবিধা রয়েছে যে এটি যে কোনও ডিরেক্টরি পরিষেবা ব্যবহার করতে পারে (ওয়াইপি / এনআইএস বা এলডিএপি ইত্যাদি) এবং স্থানীয় পাসওয়ার্ড ডাটাবেস ফাইলকে জিজ্ঞাসা করবে।


সমস্যাটি 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

... বা :-অনুষ্টিত ক্ষেত্রগুলির প্রথমটির বিপরীতে অন্য কোনও অনুরূপ পরীক্ষা ।


@ এসডসোলার আপনার কোডটি সম্ভবত bashসেই ক্ষেত্রে কার্যকর করা হয়নি ।
কুসালানন্দ

1

উদাহরণস্বরূপ এখানে একটি উত্তর দেওয়া হয়েছে:

ডেটা লগারগুলি অনলাইনে রয়েছে তা নিশ্চিত করার জন্য 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মোটেন্টটিতে দেখতে পাবেন


এফওয়াইআই, &>/dev/nullত্রুটি সহ, কমান্ড থেকে সমস্ত আউটপুট পুনঃনির্দেশ ব্যবহার করে/dev/null

(শর্তসাপেক্ষে শুধুমাত্র এর প্রয়োজন exit statusহয়ping কমান্ড)

এছাড়াও অবগতির জন্য, যে যেহেতু নোট cronকাজ চালানো যেমন rootব্যবহার করতে কোন প্রয়োজন নেই sudo pingএকটি cronস্ক্রিপ্ট।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.