শেল স্ক্রিপ্টিংয়ে কীভাবে লজিকাল ওআর অপারেশন করবেন


571

আমি একটি সাধারণ শর্ত চেক করার চেষ্টা করছি, তবে এটি কাজ করছে বলে মনে হচ্ছে না।

এর $#সমান 0বা তার চেয়ে বেশি হলে 1হ্যালো বলুন।

আমি কোনও সাফল্য ছাড়াই নিম্নলিখিত বাক্য গঠন চেষ্টা করেছি:

if [ "$#" == 0 -o "$#" > 1 ] ; then
 echo "hello"
fi

if [ "$#" == 0 ] || [ "$#" > 1 ] ; then
 echo "hello"
fi

তারা দুজনেই আমার পক্ষে কাজ করে। আপনি শেবাং লাইনে একটি শেল নির্দিষ্ট করেছেন ?
— জেসন ম্যাকক্রারি

1
@ জেসন আমি আসলে শেবাং লাইনটি ভুলে গেছি, তবে আমি এখনই এটি দিয়ে এটি পরীক্ষা করেছি এবং এটি কার্যকর হয়নি।
— স্ট্রবেরি

25
>sh / bash এ আউটপুট পুনঃনির্দেশ। এখন আপনার কাছে সম্ভবত একটি ফাইল রয়েছে 1।
— 4o

বাশ তুলনা সম্পর্কিত তথ্যের জন্য, দয়া করে পূর্ববর্তী প্রশ্নের উত্তরগুলি এখানে এবং এখানে দেখুন । বন্ধনী, ডাবল বন্ধনী এবং ডাবল বন্ধনী সম্পর্কিত অতিরিক্ত তথ্যের জন্য, আমার উত্তরটি এখানে দেখুন ।
— পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

আপনার তুলনামূলক ভুলটি টাইপ করার কারণে এটি কাজ করে না: "$ #" == "0" বা-# -eq 0
— ইটেক

উত্তর:


987

এই কাজ করা উচিত:

#!/bin/bash

if [ "$#" -eq 0 ] || [ "$#" -gt 1 ] ; then
    echo "hello"
fi

আমি নিশ্চিত না যে এটি অন্যান্য শেলগুলির মধ্যে আলাদা কিনা তবে আপনি <,> ব্যবহার করতে চান তবে আপনার সেগুলি ডাবল প্রথম বন্ধনে আবদ্ধ করতে হবে:

if (("$#" > 1))
 ...

2
আমি নিশ্চিত নই যে এটি অন্য শেলের থেকে আলাদা তবে ব্যাশে, আপনি যদি> বা <ব্যবহার করতে চান তবে আপনাকে সেগুলি ডাবল প্রথম বন্ধনে রাখতে হবে: (("$ a" <"$ b"))
— কোডিং জেলা

1
@ ডগ: এটি যে ইউনিক্স সেগুলি ব্যবহার করে না, এটি বাশ এবং আমি জানি অন্যান্য সমস্ত শেলগুলি ইনপুট / আউটপুট পুনঃনির্দেশের জন্য এগুলি ব্যবহার করে।
— ক্যাস্যাবেল

56

এই কোডটি আমার পক্ষে কাজ করে:

#!/bin/sh

argc=$#
echo $argc
if [ $argc -eq 0 -o $argc -eq 1 ]; then
  echo "foo"
else
  echo "bar"
fi

আমি মনে করি না sh "" == "সমর্থন করে। ইনটগুলির সাথে তুলনা করতে স্ট্রিংগুলি এবং -eq এর সাথে তুলনা করতে "=" ব্যবহার করুন।

man test

বিস্তারিত জানার জন্য.


এর চেয়ে বড় বিকল্প কী? টিহসের সরকারী নথিপত্র কোথায়?
— স্ট্রবেরি

3
এর -gtচেয়ে বড় হওয়া উচিত। বা কেবল এগুলি দিয়ে প্রতিস্থাপন করুন [ $# -ne 1 ]।
— 4o

-জিটি এর চেয়েও বড়, আমার উত্তর দেখুন। সরকারী দস্তাবেজটি মানব পরীক্ষায় রয়েছে যেমন জিব্র্যামেন্ট বলেছে।
— জেলা কোডিং

আপনার শেলের উপর নির্ভর করে অন্যের জন্য যেমন একটি ফাই, তুলনা অপারেটর হিসাবে সর্বাধিক সমর্থন == (এখন একটি দিন) তবে বেশিরভাগ সময় এটি = অপারেটরের সমান হয়। আমি কল্পনা করব যে আপনি যদি তুলনা করার জন্য -gt এবং -ne ব্যবহার করে থাকেন যে আপনার স্ক্রিপ্টিং শৈলীর ধারাবাহিকতা বজায় রাখতে == বা = এর জন্য -eq ব্যবহার করা ভাল অনুশীলন হবে। শুভ বাশিং :)
— jkdba

34

আপনি যদি ব্যাশ প্রস্থান কোড স্থিতি ব্যবহার করছেন ? পরিবর্তনশীল হিসাবে এটি করা ভাল:

if [ $? -eq 4 -o $? -eq 8 ] ; then  
   echo "..."
fi

কারণ যদি আপনি:

if [ $? -eq 4 ] || [ $? -eq 8 ] ; then  

বা বাম অংশ গন্ধে পরিবর্তন $? পরিবর্তনশীল, সুতরাং এর ডান অংশটির মূল have নেই ? মান।


2
$ # স্ক্রিপ্টে পাস হওয়া আর্গুমেন্টের সংখ্যা প্রদান করে। সঠিক ব্যবহার পরীক্ষা করার জন্য দরকারী। মনে হয় না যে প্রশ্নকারী প্রস্থান কোড ব্যবহার করছে।
— সেন্টিমিমান

27

কখনও কখনও আপনাকে ডাবল বন্ধনী ব্যবহার করতে হবে, অন্যথায় আপনি অনেকগুলি আর্গুমেন্টের মতো একটি ত্রুটি পান

if [[ $OUTMERGE == *"fatal"* ]] || [[ $OUTMERGE == *"Aborting"* ]]
  then
fi

1
এটি দরকারী কারণ এটি এখানে একমাত্র জিনিস যা আমি দেখতে পাই না এমন একটি সংখ্যার তুলনা, যা সিনট্যাক্সে কিছুটা আলাদা।
— ক্রিস্টোফার হান্টার


7

আপনি কি এরকম কিছু চেষ্টা করেছেন:

if [ $# -eq 0 ] || [ $# -gt 1 ] 
then
 echo "$#"
fi

হ্যাঁ আমার আছে. echoআমার একক তর্ক থাকলেও এটি হ্যালো।
— স্ট্রবেরি

দ্বিতীয়টি $#প্রথম পরীক্ষার রিটার্ন মান হতে পারে?
— ভাগ্যডায়োন্ড

5

বাশ রেফারেন্স ম্যানুয়াল থেকে 4 3.4.2 বিশেষ পরামিতি

#
($ #) দশমিকের অবস্থানগত পরামিতিগুলির সংখ্যাতে প্রসারিত হয়।

সুতরাং, $#সর্বদা 0 বা বড় সংখ্যার হবে।

সুতরাং আপনি যদি $#1 এর চেয়ে 0 বা বড় হয় তখনই কিছু করতে চান তবে আপনাকে কেবল এটি কিনা আছে কিনা $#তা পরীক্ষা করে দেখতে হবে 1:

[ $# -eq 1 ] && echo "1 positional param" || echo "0 or more than 1"

এটি সিনট্যাক্স ব্যবহার করে:

[ condition ] && {things if true} || {things if false}

[[ -n $A ]] && echo 1 || echo 2
— ব্যাশে

@ premek.v মন্তব্যের জন্য ধন্যবাদ। আমার উত্তরটি খুব খারাপভাবে ব্যাখ্যা করা হয়েছিল, আমি কেবলমাত্র এই আশায় এটি সম্পাদনা করেছি যে এটি বিষয়টিতে আরও আলোকপাত করবে।
— ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

1

এবং বাশে

 line1=`tail -3 /opt/Scripts/wowzaDataSync.log | grep "AmazonHttpClient" | head -1`
 vpid=`ps -ef|  grep wowzaDataSync | grep -v grep  | awk '{print $2}'`
 echo "-------->"${line1}
    if [ -z $line1 ] && [ ! -z $vpid ]
    then
            echo `date --date "NOW" +%Y-%m-%d` `date --date "NOW" +%H:%M:%S` :: 
            "Process Is Working Fine"
    else
            echo `date --date "NOW" +%Y-%m-%d` `date --date "NOW" +%H:%M:%S` :: 
            "Prcess Hanging Due To Exception With PID :"${pid}
   fi

বাশ-এ

line1=`tail -3 /opt/Scripts/wowzaDataSync.log | grep "AmazonHttpClient" | head -1`
vpid=`ps -ef|  grep wowzaDataSync | grep -v grep  | awk '{print $2}'`
echo "-------->"${line1}
   if [ -z $line1 ] || [ ! -z $vpid ]
    then
            echo `date --date "NOW" +%Y-%m-%d` `date --date "NOW" +%H:%M:%S` :: 
            "Process Is Working Fine"
    else
            echo `date --date "NOW" +%Y-%m-%d` `date --date "NOW" +%H:%M:%S` :: 
            "Prcess Hanging Due To Exception With PID :"${pid}
  fi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.