ল্যাজিকাল এবং বাশ স্ক্রিপ্টে


10

ifআমার বাশ স্ক্রিপ্টে আমার একটি আছে যা যাচাই করে দেখতে হবে যে 2 টি ফাইলের EITHER উপস্থিত রয়েছে কিনা, যদি সেগুলি না থাকে তবে এটি মেলানো উচিত।

আমার কাছে কোডটি রয়েছে:

if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi

তবে এটি কোনও কারণে কাজ করছে বলে মনে হয় না।

আমি ১১০% নিশ্চিত যে এই 2 টি ফাইলের অস্তিত্ব নেই। আমি কোনও ত্রুটি পাই না, এটি কেবল প্রবেশ করে না if

আমি স্ক্রিপ্টিংকে বাশ করতে নতুন তাই আমি কী জানি ভুল হতে পারে তা নিশ্চিত নই।


আমি মনে করি না পোস্ট করা উত্তরগুলির মধ্যে কোনওটিই আসলে প্রশ্নের উত্তর দেয়। আপনি স্বতন্ত্রভাবে পরীক্ষাগুলি চেষ্টা করার পরে কী ঘটে? কি [[ ! -f /etc/.../... ]]; echo $?প্রত্যেকের জন্য।
jw013

একটি সতর্কতা : [[ -f xxx ]]এক্সএক্সএক্সএক্স উপস্থিত থাকলে এবং এটি নিয়মিত ফাইল (বা একটি নিয়মিত ফাইলে একটি সিমলিংক) হলে সত্যটি ফিরে আসে । এটি উপস্থিত না থাকলে এটি মিথ্যা প্রত্যাবর্তন করবে বা এটি উপস্থিত থাকতে পারে বা না থাকলে বা এটি উপস্থিত থাকলে তা জানাতে পারে না তবে এটি কোনও নিয়মিত ফাইল নয় (ডিরেক্টরি, পাইপ, ডিভাইস, সকেট ...) বা এটি যদি একটি সিমলিংক থাকে কোনও ফাইল নেই যা বিদ্যমান নেই বা এটি বলতে পারে না এটি বিদ্যমান কিনা বা নেই বা নিয়মিত ফাইল নয় ... [[ -e $file ]] || [[ -L $file ]]অস্তিত্বের জন্য পরীক্ষার কাছাকাছি। ls -d -- "$file" > /dev/null 2>&1আরও কাছাকাছি। এবং একটি নিয়ম হিসাবে, এই জাতীয় পরীক্ষা জাতিগত অবস্থার দিকে পরিচালিত করে। হতে পারে অন্য উপায় আছে।
স্টাফেন চেজেলাস

উত্তর:


12

আপনি যদি চান পারেন তারপর যদি আপনি চান OR, না AND

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi
  • দুটি বা দুটি ফাইলই অনুপস্থিত থাকলে এটি মিলবে।
  • আপনার কোডটি কেবল তখনই মুদ্রিত হবে matchযদি উভয়ের অস্তিত্ব থাকে না।

তবে , আপনি বলেছেন:

আমি ১১০% নিশ্চিত যে এই 2 টি ফাইলের অস্তিত্ব নেই। আমি কোনও ত্রুটি পাই না, এটি কেবল যদি প্রবেশ করে না।

সুতরাং আপনার বিবৃতি নিজেই স্ববিরোধী। আপনি যদি সেই কোডটি চালাচ্ছেন তবে সেই ফাইলগুলির মধ্যে অন্তত একটির উপস্থিত থাকা আবশ্যক

আপনার ifবিবৃতি কীভাবে মূল্যায়ন করছে তা যদি আপনি দেখতে চান তবে এটি দিয়ে চালান -x

#!/bin/bash -x
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi

তারপরে আপনি ফাঁসিটি দেখতে পাবেন।

$ ./test.sh
+ [[ ! -f /etc/benchmarking/code ]]
+ [[ ! -f /etc/benchmarking/code.class ]]
+ echo match
match
$ 

উভয়ই উপস্থিত না থাকলে এটি "ম্যাচ" প্রতিধ্বনিত করতে চাই, যদি কারও উপস্থিত না থাকে তবে এটি মুদ্রণ মেলে না। আমি -x
Peppercat101

সেক্ষেত্রে আপনার মূল কোডটি ভাল হওয়া উচিত। এবং সত্যিই এটি আমার জন্য কাজ করে।
বাহামাত

3

এমন কি হওয়া উচিত নয়? এ একটি ফাইল বা বি একটি ফাইল, তারপরে ব্লেবলা।

if [[ -f /etc/benchmarking/code ]] || [[ -f /etc/benchmarking/code.class ]]; 
then  
  echo "match"
fi

3

এটি আপনি যা করার চেষ্টা করছেন তার জন্যও এটি কাজ করতে পারে। একক বন্ধনী আজ সাধারণত ব্যাশের সাথে ব্যবহৃত হয় না, তবে এটি এখনও একটি বিকল্প। '-O' ব্যবহার করা কার্যকরভাবে একটি "OR" অপারেশন এবং "!" অবস্থা অবহেলা।

var=/etc/benchmarking/code
[ ! -f ${var} -o -f {var}.class ] && echo "match"

কি ব্যবহার করবেন না [যে bash। এটি বাদ দিয়ে, আমি কীভাবে এটি প্রশ্নের উত্তর দেয় তা দেখতে ব্যর্থ fail
jw013

[ ! -f ${var} -a ! -f {var}.class ] && echo "match"এটা করা উচিত. অনুসন্ধান ছিল: যদি তাদের (উভয়) অস্তিত্ব না থাকে তবে এটি হওয়া উচিত echo match
এইচএসচো

0

আপনার কোড আপনার প্রয়োজনীয়তা পূরণ করে: এটি মুদ্রণ করে দেবে matchযে এটি কোনও ফাইল খুঁজে পাবে না।

সুতরাং কারণ matchমুদ্রিত হচ্ছে না অন্য কোথাও। আপনার অবশ্যই নিশ্চিত হওয়া উচিত যে কোড ব্লকটি পৌঁছেছে, যা আপনি বেশ কয়েকটি ডিবাগ বার্তার সাহায্যে ঘিরে রেখে করতে পারেন। উদাহরণস্বরূপ, এটি পছন্দ করুন:

echo '@ About to enter if...fi block'
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi
echo '@ Finished if...fi block'

আমার স্বাভাবিক পক্ষপাত বার্তা ডিবাগ যেতে হয় stderr তথ্য প্রবাহ বিঘ্নিত এড়াতে তাই stdout- এ , কিন্তু আমি যে এখানে এড়ানো কারণ আপনি বলেন আপনি একটি শিক্ষানবিস ছিলেন। আপনি কীভাবে stdout এ লিখতে পারেন তার একটি উদাহরণ এখানে দেওয়া হয়েছে :

echo '@ About to enter if...fi block' >&2
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.