বাশ, কোনও যুক্তি সতর্কতা এবং কেসের সিদ্ধান্ত


110

আমি বাশ শিখছি

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

আমি ব্যাশের নতুনদের জন্য সেরা অনলাইন ম্যানুয়ালগুলির পরামর্শও জানতে চাই

ধন্যবাদ

উত্তর:


176
if [[ $# -eq 0 ]] ; then
    echo 'some message'
    exit 0
fi

case "$1" in
    1) echo 'you gave 1' ;;
    *) echo 'you gave something else' ;;
esac

উন্নত ব্যাশ-স্ক্রিপ্টিং গাইড বেশ ভাল। এর নাম সত্ত্বেও, এটি বেসিকগুলি ব্যবহার করে।


RE: "প্রস্থান 0" আমি জানি না স্ক্রিপ্ট থেকে বেরিয়ে আসার সময় তাঁর মনে কী ছিল। তবে হ্যাঁ, এটি একটি দুর্দান্ত গাইড।
ট্রাম্পাস কির্ক

আমি "এবং" "অন্যথায়" হিসাবে ব্যাখ্যা করেছি, ধরে নিলাম যে বার্তাটি কোনও সহায়তা পাঠ্য হবে। কিন্তু আমি নিশ্চিত ভের্নার জিনিসটা কি যে লাইন করে সক্ষম হয় আছি এবং তা হচ্ছে তিনি এটা চায় :)
টমাস

ধন্যবাদ, অবশ্যই! এবং শেষ কথা, আমি কীভাবে ত্রুটি বার্তাগুলি আইপি স্ক্রিপ্টটি বন্ধ করব, যাতে সেগুলি শেলটিতে প্রদর্শিত হয় না?
রাস্তা

আপনি যে নির্দিষ্ট প্রোগ্রামটি কল করছেন তার থেকে ত্রুটিগুলি বোঝানো হচ্ছে? আপনি এর স্ট্যান্ডার্ড আউটপুট এবং / অথবা স্ট্যান্ডার্ড ত্রুটি প্রবাহকে বিস্মৃত করতে প্রেরণ করতে > /dev/nullএবং / বা 2> /dev/nullতার পরে করতে পারেন।
টমাস

4
যদি আপনি কোনও অনুপস্থিত আর্গুমেন্টকে খারাপ কিছু মনে করেন (স্ক্রিপ্টের মতো তবে সফলভাবে সঞ্চালন করতে পারে না), 0 ( exit 1) এর চেয়ে আলাদা কিছু ফিরিয়ে দিন । রিটার্ন / প্রস্থান কোডগুলি সম্পর্কে আরও কনভেনশন রয়েছে, যা আপনি অনলাইনে দ্রুত খুঁজে পেতে পারেন, তবে গুরুত্বপূর্ণ বিষয়টি এটি 0 হওয়া উচিত নয়, যা সাফল্যের ইঙ্গিত দেয়।
ফেলিক্স

25

যদি কেবলমাত্র কোনও যুক্তি অনুপস্থিত থাকে তবে জামিনে আগ্রহী, প্যারামিটার সাবস্টিটিউশনটি দুর্দান্ত:

#!/bin/bash
# usage-message.sh

: ${1?"Usage: $0 ARGUMENT"}
#  Script exits here if command-line parameter absent,
#+ with following error message.
#    usage-message.sh: 1: Usage: usage-message.sh ARGUMENT

11

উদাহরণ

 if [ -z "$*" ]; then echo "No args"; fi

ফলাফল

No args

বিস্তারিত

-z হ'ল স্ট্রিংয়ের দৈর্ঘ্যের শূন্যতার জন্য অ্যানারি অপারেটর। $*সমস্ত যুক্তি হয়। উদ্ধৃতিগুলি সুরক্ষার জন্য এবং যদি উপস্থিত থাকে তবে একাধিক আর্গুমেন্টকে encapsulating।

এই জাতীয় আরও অপারেটরগুলির জন্য "unary" এর জন্য man bash( / কী) ব্যবহার করুন এবং অনুসন্ধান করুন ।


7
এটির সাথে একটি (মাইনর) সমস্যা হ'ল এটি কোনও আর্গুমেন্ট পাস করার এবং খালি স্ট্রিংটিকে আর্গুমেন্ট হিসাবে পাস করার মধ্যে পার্থক্য করে না। এটি কিছু প্রসঙ্গে গুরুত্বপূর্ণ হতে পারে। [$ # -Eq 0] ব্যবহার করে উভয় ক্ষেত্রেই সঠিকভাবে পরিচালনা করা যায়।
ইডেলিক

1
আহ, (বা) এস প্রোগ্রামিংয়ের সূক্ষ্মতা ... এই কারণেই আমি এটি ঘৃণা করি।
টমাস

1
মনে -zযেমন mizzing
সত্যজিৎ ফস

4

পুরানো তবে আমার কাছে উত্তরটি পুনরায় কাজ করার কারণ আছে আগের কিছু বিভ্রান্তির জন্য ধন্যবাদ:

if [[ $1 == "" ]] #Where "$1" is the positional argument you want to validate 

 then
 echo "something"
 exit 0

fi

কোনও অবস্থানগত আর্গুমেন্ট is 1 না থাকলে এটি "কিছু" প্রতিধ্বনিত হবে। এটি বৈধতা দেয় না যে $ 1 এ নির্দিষ্ট তথ্য রয়েছে।


$#যুক্তি সংখ্যার সুস্পষ্টভাবে পূর্ণসংখ্যা গণনা; এটি হয় "0" হবে এবং কোনও যুক্তি না থাকলেও আপনি "কিছু" প্রতিধ্বনিত হবেন, বা এটি কিছু ধনাত্মক সংখ্যা হবে এবং আপনি "কিছু" সঠিকভাবে প্রতিধ্বনিত হবেন। তবে চেক নিজেই কখনই কিছু করবে না, আপনি যে ইনপুট এবং ইনপুট ব্যবহার করেন তা নির্বিশেষে - এটি সর্বদা প্রতিবেদন করবে $#যার একটি মান রয়েছে। সুতরাং এটি সম্পূর্ণরূপে ভুল এবং দাবি হিসাবে কখনও কাজ করবে না।
eschwartz

আপনি কি সম্পূর্ণরূপে ইতিবাচক? আমার বেশ কয়েকটি স্ক্রিপ্ট রয়েছে যা এই সঠিক ফর্ম্যাটটি ব্যবহার করার উদ্দেশ্যে কাজ করে। আপনার প্রতিক্রিয়া পড়ে আমি এমনকি ম্যাচ এবং এর অভাবের জন্য উভয়ই প্রতিক্রিয়া জানালাম। যদি আপনার দৃশ্যে # এর সাথে মিল রাখার কোনও অবস্থানগত যুক্তি না থাকে তবে নির্দিষ্ট না হলে $ # তে কোনও মান থাকবে না। এটি কোনও অর্থবোধ করে না কেন বাশ কেন স্থিতিগত যুক্তিতে একটি মান ধরে নেয় যা সেখানে নেই।
রায়ান স্মিথ

echo $#স্ক্রিপ্ট /tmp/test.sh এর বিষয়বস্তু হিসাবে চেষ্টা করুন , তারপরে এটি / বিন / বাশের পাশাপাশি / বিন / শের (বা / বিন / ড্যাশ এবং আপনার কাছে যে কোনও শেল প্রয়োগ রয়েছে) চালান। /tmp/test.sh"0" তে প্রতিধ্বনিত হবে কনসোলটি যেমন হবে /bin/dash /tmp/test.sh, অন্যদিকে, /tmp/test.sh foo"1" /tmp/test.sh first secondপ্রতিধ্বনিত হবে এবং "2" প্রতিধ্বনিত হবে
এসচওয়ার্টজ

অনুযায়ী man bash, বিভাগ "বিশেষ পরামিতি", মধ্যে; "দশমিক মধ্যে অবস্থানগত পরামিতি সংখ্যা পৌঁছাতে # বিস্তৃতি ঘটে।" "শেল একইরূপে বিভিন্ন পরামিতি বিশেষভাবে এই স্থিতিমাপগুলো শুধুমাত্র রেফারেন্সড হতে পারে। তাদের নিয়োগ অনুমতি দেওয়া হয় না।", এবং এটি একইভাবে পবিক্স
অনলাইনপবস

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