শর্তাধীন বিবৃতিতে আমি কীভাবে কোনও স্ক্রিপ্ট থেকে প্রস্থান করব?


50

আমি একটি বাশ স্ক্রিপ্ট লিখছি যেখানে আমি ব্যবহারকারীর রুট না থাকলে আমি প্রস্থান করতে চাই। শর্তসাপেক্ষে ঠিকঠাক কাজ করে তবে স্ক্রিপ্টটি প্রস্থান করে না।

[[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit)

আমি চেষ্টা করেছি কিন্তু এর &&পরিবর্তে ;দু'জনেরই কাজ হয়নি।

উত্তর:


50

আপনি এইভাবে করতে পারেন:

[[ $(id -u) -eq 0 ]] || { echo >&2 "Must be root to run script"; exit 1; }

(প্রথম বিবৃতিতে পাটিগণিত বাইনারি অপারেটরের সাথে "সাধারণ" শর্তসাপেক্ষ প্রকাশ), বা:

(( $(id -u) == 0 )) || { echo >&2 "Must be root to run script"; exit 1; }

(প্রথম পরীক্ষার জন্য পাটিগণিত মূল্যায়ন)।

পরিবর্তন লক্ষ্য করুন ()-> {}- কোঁকড়া বন্ধনী না না একটি subshell ডিম। ( man bash"সাবশেল" অনুসন্ধান করুন ))


1
শূন্য ব্যতীত কোনও কোড সহ প্রস্থান করুন, উদাহরণস্বরূপ: exit 1পিতামাতার প্রক্রিয়াটি বোঝার জন্য যাতে কোন সমস্যা দেখা দিয়েছে।
স্যামকে

1
আপনার [[সংখ্যার তুলনা, ব্যবহারের জন্য ব্যবহার করা উচিত নয় ((
ক্রিস ডাউন

1
@ ক্রিসডাউন [[ঠিক আছে, যতক্ষণ না আপনি তার -eqপরিবর্তে ব্যবহার করেন ==
যাক_মী_বিহীন

শর্তসাপেক্ষে স্থির করা হয়েছে, @ ক্রিসডাউনে পাটিগণিত সংস্করণ যুক্ত হয়েছে।
মাদুর

2
@ ম্যাট উপায়ে, আপনি এটি সংক্ষিপ্ত করতে পারেন(( EUID )) && ...
ক্রিস ডাউন

21

এই কমান্ডগুলির চারপাশে প্রথম বন্ধনী একটি সাব-শেল তৈরি করে । আপনার সাবশেল ইকোস "স্ক্রিপ্ট চালানোর জন্য অবশ্যই মূল হতে হবে" এবং তারপরে আপনি সাব - শেলটি প্রস্থান করতে বলবেন (যদিও এটি ইতিমধ্যে থাকত, যেহেতু আর কোনও আদেশ ছিল না)। এটির সমাধানের সবচেয়ে সহজ উপায় হ'ল কেবল একটি ব্যবহার করা if:

if [[ `id -u` != 0 ]]; then
    echo "Must be root to run script"
    exit
fi

তাহলে ওয়ান-লাইনার দিয়ে এটি করার কোনও উপায় নেই?
গ্যারেট হল

1
আপনার যুক্তি পিছনের দিকে। আপনার উদাহরণে, যদি id -u == 0, অর্থ হবে যা আপনি হয় রুট। আপনি চান [[ $(id -u) != 0 ]]; then
টিম কেনেডি

4
যদি আপনার / অবশ্যই / ওয়ান-লাইনার থাকে তবে আকারের জন্য এটি ব্যবহার করে দেখুন: [ "$UID" != 0 ] && echo 'You have to be root.' && exit 1;এটিও নোট করুন $UID, যা কোনও প্রক্রিয়া তৈরি করে সংরক্ষণ করে। আমি মনে করি আপনি এমনকি পছন্দ করতে পারেন $EUID
janmoesen

1
@ জানমোয়েসেন, ভাল কথা। এবং যখন পুঁচকে একটি সাংখ্যিক মান সঙ্গে একটি পরিবর্তনশীল আছে: ((UID)) && echo 'You have to be root.' && exit 1
manatwork

3
@ জানমোয়েসন: নোট করুন যে এই জাতীয় বিপরীত যুক্তি ব্যবহারের ফলে কোনও স্ক্রিপ্ট set -eবাতিল হয়ে যায়। সেই সমস্যার একটি সমাধান হ'ল [ "$UID" != 0 ] && echo 'You have to be root.' && exit 1 || true
সাম होচেভার

2

সঙ্গে ব্যাশ :

[ $UID -ne 0 ] && echo "Must be root to run script" && exit 1

এটি ব্যর্থ হলে প্রস্থান করতে ব্যর্থ হবে echo(উদাহরণস্বরূপ কারণ স্টাডআউট লিখনযোগ্য নয়)।
স্টাফেন চেজেলাস

1

বন্ধনী কাছাকাছি ||এবং &&এই হিসাবে প্রয়োজন নেই ডান-মিশুক হয়। নিম্নলিখিত দুটি এক্সপ্রেশন সমতুল্য:

expr1 || expr2 && expr3
expr1 || { expr2 && expr3 }

সুতরাং &&পরিবর্তে ;শুধু জরিমানা কাজ করবে, যেমন echoসত্য ফিরে আসবে।

[[ $(id -u) == 0 ]] || echo "Must be root to run script" && exit 1

1
আপনি যা বলেছেন তা সবই সঠিক, যদিও এটি শিখার জন্য একটি খারাপ প্যাটার্ন, কারণ আপনি expr2 এর ফেরতের মূল্যের উপর নির্ভর করছেন। আপনি কি নিশ্চিত যে প্রতিধ্বনি সর্বদা 0 প্রস্থান স্থিতি ফিরে আসবে? কোঁকড়া ধনুর্বন্ধনী এবং আধা-কোলনের সাহায্যে বিবৃতিগুলিকে গ্রুপ করা আরও ভাল ধারণা। এই যেমন একটি সাধারণ ফাঁদ এটা BashPitfalls তার নিজস্ব এন্ট্রি আছে যা mywiki.wooledge.org/BashPitfalls#cmd1_.26.26_cmd2_.7C.7C_cmd3
Flimm

1
@ ফ্লিম: আমি এটি মানি না যে এটি একটি খারাপ প্যাটার্ন। স্পষ্টতই, এটি ব্যবহারটি কেস-নির্ভর, এবং আপনি যে রিটার্ন মান পাবেন সে সম্পর্কে আপনার জ্ঞানের উপরও নির্ভর করে। এই ক্ষেত্রে আমি নিশ্চিত প্রতিধ্বনি 0 ফিরে আসবে সময়ের 99.999%, এবং যদি এটি একটি লেখার ত্রুটি stomps (শুধুমাত্র যদি এটি 0 ফিরে না) এই expr চেয়ে বড় সমস্যা হয়েছে। আপনি রিটার্ন মানগুলি উত্পাদন করছেন এমন ক্ষেত্রেও রয়েছে, তাই না, এটি আমার পক্ষে কোনও "খারাপ প্যাটার্ন" নয়।
এটা

আমিও যুক্ত করব, যেমন এটি উইকিতে বলা হয়েছে যে সি মূল্যায়ন বুঝতে পারলে আপনার এটি ব্যবহার করা উচিত। যাইহোক, সামান্য পরীক্ষার ফলে যে কোনও অস্পষ্টতা পরিষ্কার করা উচিত।
এটা

0

এটি আপনাকে সাহায্য করতে পারে

[oracle@rac1 ~]$ which bash
/bin/bash
[oracle@rac1 ~]$ cat test1.sh
if [ `id -u` != 0 ]
then
echo "Must be root to run the script
 "
exit
fi

3
এটি ইতিমধ্যে উত্তর এবং গ্রহণ করা হয়েছে। এছাড়াও, আপনার উত্তর ইতিমধ্যে পোস্ট করা হয়েছে কি অনুরূপ কাছাকাছি।
মোলিংলাভস

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