আমি চাই 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
শেলগুলির মূল্যায়ন খুব নমনীয় হওয়ার জন্য ডিজাইন করা হয়েছে এবং অনেক সময় কমান্ডের শৃঙ্খলার প্রয়োজন হয় না (যেমনটি আপনি লিখেছেন)।
এছাড়াও, আপনার কোডটি যেমন $( ... )
রয়েছে তেমনভাবে দেখে , আপনার সিএমডি-প্রতিস্থাপনের ফর্মের ব্যবহারটি প্রশংসা করার মতো, তবে কী প্রক্রিয়াটি বেরিয়ে আসছে তা ভেবে দেখুন। 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
এটির সেমিডি-লাইনে কোনও ফাইলের নাম নেওয়া যেতে পারে, তাই যখন আপনার দরকার নেই তখন অতিরিক্ত প্রক্রিয়া এবং পাইপ নির্মাণের জন্য কেন অনুরোধ করবেন? ;-)
আশা করি এটা কাজে লাগবে.
grep "^$user:" /etc/passwd
অনুসন্ধান করতে আরো সঠিক উপায় / হবে etc / passwd incidently - grep -v
যেখানে -v অনুসন্ধান inverts যদি আপনি চেয়েছিলেন গণ্ডগোল এড়ানোর জন্য ||
(( $( 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
।
বিভ্রান্তিকর অন্য উত্তরগুলি খুঁজে পেয়েছি, আশা করি এটি কারও সহায়ক হবে।
ইউনিক্স সিস্টেমে এটি সমর্থন করে (এটি ম্যাকোস হিসাবে মনে হয় না):
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
সেই ক্ষেত্রে কার্যকর করা হয়নি ।
উদাহরণস্বরূপ এখানে একটি উত্তর দেওয়া হয়েছে:
ডেটা লগারগুলি অনলাইনে রয়েছে তা নিশ্চিত করার জন্য 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
স্ক্রিপ্ট।
!
বন্ধনী ভিতরে থাকা উচিত নয়? অর্থাত্[ ! EXPR ]