আমি চাই 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
আমি চাই 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
উত্তর:
চেষ্টা
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এটির সেমিডি-লাইনে কোনও ফাইলের নাম নেওয়া যেতে পারে, তাই যখন আপনার দরকার নেই তখন অতিরিক্ত প্রক্রিয়া এবং পাইপ নির্মাণের জন্য কেন অনুরোধ করবেন? ;-)
আশা করি এটা কাজে লাগবে.
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 ]