সাফল্য না হওয়া পর্যন্ত আপনি কীভাবে ব্যাশ ওভারে একটি কমান্ড চালাতে পারেন


237

আমার কাছে একটি স্ক্রিপ্ট রয়েছে এবং ব্যবহারকারীকে কিছু তথ্যের জন্য জিজ্ঞাসা করতে চাই, ব্যবহারকারী যতক্ষণ না এই তথ্য পূরণ করে ততক্ষণ স্ক্রিপ্টটি চলতে পারে না। এটি অর্জনের জন্য একটি লুপে একটি কমান্ড স্থাপনের চেষ্টা আমার নীচে তবে এটি কোনও কারণে কার্যকর হয় না।

echo "Please change password"
while passwd
do
echo "Try again"
done

আমি যখন লুপটির বিভিন্ন প্রকারের চেষ্টা করেছি:

while `passwd`
while [[ "`passwd`" -gt 0 ]]
while [ `passwd` -ne 0 ]]
# ... And much more

তবে আমি এটি কাজে লাগাতে পারি না।

উত্তর:


403
until passwd
do
  echo "Try again"
done

অথবা

while ! passwd
do
  echo "Try again"
done

20
এটি থেকে Ctrl-C এর পক্ষে অসুবিধা।
ডনগার

আপনি যদি মনে করেন আপনার এটি বাতিল করা দরকার, কেবল আপনার শেলের একটি নতুন উদাহরণ খুলুন (উদাহরণস্বরূপ, "bash" টাইপ করুন) এবং, আপনি যখন এটি বাতিল করতে চান, অন্য টার্মিনাল উইন্ডোতে যান এবং সদ্য তৈরি হওয়া বাশটিকে হত্যা করুন প্রক্রিয়া।
ইথান

50
এর থেকে সহজেই সিটিআর-সি করা: until passwd; do echo "Try again"; sleep 2; done- আপনাকে যা করতে হবে তা হ'ল ঠিক পরে (প্রদত্ত দুই সেকেন্ডের মধ্যে) echoকাজটি করার পরে সিটিআর-সি টিপুন ।
খ্রিস্টান

9
@ আজমেউক: এর মতো কিছু চেষ্টা করুন until passwd || (( count++ >= 5 )); do echo "foo"; done(কেবলমাত্র বাশ, যদি সেই পরিবর্তনশীল উপস্থিত থাকে তবে 0 গণনা করা নিশ্চিত করে নিন) আপনার যদি সরল শি এর জন্য প্রয়োজন হয় তবে শরীরে কাউন্টারটি বাড়িয়ে নিন এবং ব্যবহার করুন []
জাস্টিন সানে

2
এই পৃষ্ঠাটি বহুবার উল্লেখ করার পরে, আদেশগুলি পুনরায় চেষ্টা করার জন্য আমি জেনেরিক বাশ ফাংশন তৈরি করার সিদ্ধান্ত নিয়েছি, এটি এখানে: gist.github.com/felipou/6fbec22c4e04d3adfae5
felipou

94

$?পরিবর্তে আপনাকে পরীক্ষা করতে হবে যা পূর্ববর্তী কমান্ডের প্রস্থান স্থিতি। passwdযদি সবকিছু ঠিকঠাক কাজ করে তবে 0 দিয়ে প্রস্থান করে এবং পাসডাব্লুড পরিবর্তন ব্যর্থ হলে শূন্য নয় (ভুল পাসওয়ার্ড, পাসওয়ার্ড মেলেনি, ইত্যাদি ...)

passwd
while [ $? -ne 0 ]; do
    passwd
done

আপনার ব্যাকটিক সংস্করণ দিয়ে, আপনি পাসডাব্লুড এর আউটপুট তুলনা করছেন, যা স্টাফ Enter passwordএবং মত পছন্দসই হবে confirm password


2
তা কি হওয়া উচিত নয় $??
শন চিন

আমি এটি পছন্দ করি কারণ এটি বিপরীত পরিস্থিতির জন্য কীভাবে মানিয়ে নেবে তা স্পষ্ট। যেমন ব্যর্থ হওয়া অবধি একটি অ-নিরস্তামূলক বাগ সহ একটি প্রোগ্রাম চালান
এরিক

সাফল্য যখন একটি শূন্য-বহির্গমন কোড দ্বারা নির্দেশিত হয়, এটি আপনার প্রয়োজন।
গুদলাগুর এগিলসন

2
আমি এই সামান্য প্রথম পরিবর্তন করে উপরে উন্নত করা যায় চিন্তা passwdসঙ্গে /bin/falseযদি আপনি কিছু লম্বা ও জটিল কমান্ড যে আপনার দুটি সংস্করণ রাখা চাই না আছে।
coladict

ইমো গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি বেশিরভাগ শেলগুলিতে কাজ করা উচিত (ব্যাশ, ম্যাক্স এবং অ্যাশ পরীক্ষিত) এবং সহজেই পরিস্থিতির সাথে মানিয়ে যায়।
লিনাক্সান্দ্রিয়া

73

@ মার্ক বি এর উত্তরটি বিস্তারিতভাবে জানাতে,

$ passwd
$ while [ $? -ne 0 ]; do !!; done

কমান্ড সুনির্দিষ্ট নয় একই জিনিস করার দুর্দান্ত উপায়।


11
দুর্ভাগ্যক্রমে আমার জন্য কাজ করে না (আমি '!!' কমান্ড খুঁজে পাইনি)। কীভাবে কাজ করার কথা?
জোহানেস রুডলফ

2
পূর্ববর্তী কমান্ডটি চালানো একটি বাশ কৌশল। উদাহরণস্বরূপ, যদি আপনি sudoকোনও কমান্ডের সামনে লিখতে ভুলে যান তবে আপনি sudo !!পূর্ববর্তী কমান্ডটি রুট সুবিধাগুলি সহ চালাতে পারবেন ।
জনএই

1
আমি কি আমার প্রোফাইলে এমন কোনও স্ক্রিপ্ট তৈরি করতে পারি যা এটি করতে পারে, তাই আমি যেতে পারি: $ Makelastwork
user230910

2
রানের মধ্যে ঘুমাবেন কীভাবে?
কামিল ডিজিডজিক

6

আপনি এটি অর্জন করতে একটি অসীম লুপ ব্যবহার করতে পারেন:

while true
do
  read -p "Enter password" passwd
  case "$passwd" in
    <some good condition> ) break;;
  esac
done

2
এটিই কেবলমাত্র একমাত্র উত্তর যা কোনও ফাংশনে আমার মাল্টি-লাইন কমান্ড লাগানোর প্রয়োজন ছিল না। আমি && breakসিলেক্ট কেসটির পরিবর্তে আমার ভেরিফিকেশন কমান্ডের পরে করেছি।
carlin.scott 21

4

যদি কেউ আবার সীমাবদ্ধতার চেষ্টা করে থাকে:

max_retry=5
counter=0
until $command
do
   sleep 1
   [[ counter -eq $max_retry ]] && echo "Failed!" && exit 1
   echo "Trying again. Try #$counter"
   ((counter++))
done

1
until $(command)মূলত সর্বদা ভুল। until commandপরিবর্তে ব্যবহার করুন। $(...)কারণ আউটপুট এর commandনিজেই একটি কমান্ড হিসাবে চালানো হবে, এবং প্রদর্শন করে প্রস্থান অবস্থা যে মাধ্যমিক কমান্ড কি লুপ চালানো বা ব্যর্থ করার সিদ্ধান্ত নেয় হতে; কমান্ড প্রতিস্থাপন উপস্থিত থাকলে কমান্ডের প্রস্থান স্থিতি বিবেচিত হবে এমন কোনও স্টাডাউট নেই কেবল তখনই ।
চার্লস ডাফি

$commandহয় কোনও বড় স্থানধারক নয় - কমান্ডগুলি স্টোর করার জন্য স্ট্রিংগুলি কেন সহজাত বিশ্বাসযোগ্য নয় সে সম্পর্কে বাশফাক # 50 দেখুন । তবুও, এটি যা ছিল তার চেয়ে ভাল; ডাউনভোট প্রত্যাহার।
চার্লস ডাফি

3
while [ -n $(passwd) ]; do
        echo "Try again";
done;

3
এটি করার উপায় এটি নয় ... আপনি পিএসএসডাব্লুডির স্টাডাউটটিকে উপেক্ষা করছেন এবং তারপরে এটি একটি অবিচ্ছিন্ন পরীক্ষা করছেন। পছন্দ করুন
রে ফস

তদ্ব্যতীত, উদ্ধৃতি না দেওয়ার কারণে, পরীক্ষাটি আউটপুট থাকলে ভুল আচরণ করতে চলেছে তবে এটি একাধিক শব্দের চেয়ে বেশি, বা একটি গ্লোব এক্সপ্রেশন যা বর্তমান ডিরেক্টরিতে ফাইলগুলির সাথে মেলে বা আরও কিছু।
চার্লস ডাফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.