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


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.