বাশ সংস্করণটি> = প্রদত্ত সংস্করণ নম্বর কিনা তা পরীক্ষা করুন


12

বাশ সংস্করণ নম্বরটি নির্দিষ্ট সংখ্যায়> = হয় কিনা তা পরীক্ষা করতে হবে। উদাহরণস্বরূপ আমার আছে:

$ bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

সহযোগী অ্যারে ব্যবহার করতে বাশ সংস্করণ নম্বরটি> = 4 হতে হবে।

আমার বাশ স্ক্রিপ্টে আমি সম্ভবত সবচেয়ে মার্জিত / দক্ষ / পঠনযোগ্য উপায়ে ওয়ান-লাইনার পরীক্ষা দিতে চাই, তবে অন্যান্য পদ্ধতিগুলিও গ্রহণযোগ্য।


আপনি দেখেছেন এমন $BASH_VERSIONএবং $BASH_VERSINFOভেরিয়েবল?
স্টিল্ড্রাইভার

@ স্টিল্ড্রাইভার নং এটি বাশ নির্দিষ্ট ক্ষেত্রে যদি আপনি এটি পোস্ট করতে চান তবে এটি একটি গ্রহণযোগ্য উত্তর হবে। তবে অন্যান্য ক্ষেত্রে পরিবেশগত ভেরিয়েবলগুলি উপলভ্য নাও হতে পারে।
উইনউইউউকস 2 ইউনিক্স

উপায় দ্বারা, সম্পর্কিত: askubuntu.com/questions/39309/...
Sergiy Kolodyazhnyy

পুনঃটুইট করেছেন যদিও আমি ব্যাশ ওয়ান-লাইনার বা স্ক্রিপ্ট / ফাংশন সন্ধান করছি কেবল বাশ সংস্করণ নম্বর পরীক্ষা করা চূড়ান্ত লক্ষ্য নয়। --versionআউটপুট সংযোজন এবং পরীক্ষা করে সমস্ত প্রোগ্রাম চেক করার একটি জেনেরিক রুটিনই ছিল মূল উদ্দেশ্য was আমি সেই অনুযায়ী প্রশ্নটি সম্পাদনা করেছি।
WinEunuuchs2Unix

সংস্করণ সংখ্যা বিন্যাসগুলি প্রোগ্রাম জুড়ে বন্যভাবে পরিবর্তিত হয়। সংস্করণের বিবরণগুলি তারা যেভাবে প্রতিবেদন করে সেগুলিও বন্যভাবে পরিবর্তিত হয়। এলোমেলো প্রোগ্রামের সংস্করণ পরীক্ষা করার উপায় জিজ্ঞাসা করা কেবল ব্যবহারিক নয়। এই প্রশ্নটি খুব বিস্তৃত।
মুরু

উত্তর:


16

চেষ্টা করুন:

$ [ "${BASH_VERSINFO:-0}" -ge 4 ] && echo "bash supports associative arrays"
bash supports associative arrays

BASH_VERSINFOএমন একটি পঠনযোগ্য অ্যারে ভেরিয়েবল যা এর সদস্যরা এই বাশের এই উদাহরণটির জন্য সংস্করণ তথ্য রাখে। যেহেতু এটি ব্যাশ ২.০ সহ প্রবর্তিত হয়েছিল, এটি সম্ভবত আপনার মুখোমুখি হওয়া সমস্ত ব্যাশ সংস্করণ দ্বারা সমর্থিত। তবে, সাবধান হওয়ার জন্য, আমরা 0পূর্বের কোনও সংস্করণ বাশের জন্য একটি ডিফল্ট মান অন্তর্ভুক্ত করি যার জন্য এই পরিবর্তনশীলটি সেট করা নেই।

অন্যান্য প্রোগ্রামগুলি থেকে সংস্করণ তথ্য উত্তোলন করা হচ্ছে

আপনি LibreOffice, পাইথন, কার্নেল ইত্যাদি সম্পর্কে জিজ্ঞাসা করেছিলেন

LibreOffice সংস্করণ তথ্য তৈরি করে যা দেখে মনে হয়:

$ libreoffice --version
LibreOffice 5.2.6.2 20m0(Build:2)

সংস্করণ নম্বরটি বের করতে:

$ libreoffice --version | cut -d' ' -f2
5.2.6.2

অজগর জন্য:

$ python -c 'import platform; print(platform.python_version())'
2.7.13

কার্নেল সংস্করণটি পেতে, ব্যবহার করুন uname:

$ uname -r
4.9.0-2-amd64

দুর্দান্ত উত্তর! কেবলমাত্র একটি নোট যে আপনার uname -r"4.9.0-2-amd64" যা আমার চেয়ে বড় পরীক্ষা করতে পারে "4.11.1-041101-জেনেরিক" যখন নিয়মিত বাশ পরীক্ষার সাথে বাস্তবে আমার সংস্করণ সংখ্যাটি বেশি হয়।
উইনউইউউকস 2 ইউনিক্স 20'17

2
@ WinEunuuchs2 ইউনিক্স পাইথন সরঞ্জামগুলি সংস্করণের স্ট্রিংগুলি নির্ভুলভাবে তুলনা করতে পারে। পাইথনে সংস্করণ স্ট্রিংগুলির তুলনা
ওয়াজান্দ্রিয়া

জন-- অজগর উদাহরণটি সংক্ষিপ্ত করা যেতে পারে $ python --versionযা দিয়ে ফিরে আসে Python 2.7.12। @ wjandrea - লিঙ্কটি +1 করার জন্য ধন্যবাদ। সম্ভবত আমি সমস্ত কল করা প্রোগ্রামের নাম এবং সর্বনিম্ন সংস্করণ সংখ্যার একটি টেবিল তৈরি করতে পারি। তারপরে pythonআপনার সরবরাহিত লিঙ্কটির একটি পরিবর্তিত অনুলিপিটিতে টেবিলটি পাস করুন । কারণ কেবল সঙ্কলিত পাইথনকেই কল করা যেতে পারে grubআপনি ভাবেন যে শেলটিতে এটি করা বা এটি সম্ভব করার জন্য বাইনারি রয়েছে।
WinEunuuchs2Unix 20'17

9

সংস্করণ সংখ্যাগুলির তুলনা করার পরিবর্তে, আপনি সরাসরি বৈশিষ্ট্যটির জন্য পরীক্ষা করতে পারেন। declare -Aআয় 2(ব্যাশ 3.2 অন্তত) যদি তা সনাক্ত না -A, যে জন্য পরীক্ষা (এটি একটি ত্রুটি ছাপে) যাতে:

unset assoc
if ! declare -A assoc ; then
    echo "associative arrays not supported!"
    exit 1
fi

( declare -A varযদি varঅ-সমিতিগত অ্যারে হয় তবে ব্যর্থও হয়, তাই unsetএটি প্রথমে।)

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


সংস্করণ সংখ্যার পরীক্ষার আরও সাধারণ ক্ষেত্রে দুটি অংশ রয়েছে: 1) কীভাবে পরীক্ষার জন্য সঠিক সংস্করণ নম্বরটি পাওয়া যায় এবং 2) কীভাবে এটি অন্য মানের সাথে তুলনা করতে হয়।

প্রথমটি আরও কঠিন একটি। অনেক প্রোগ্রাম তাদের কমান্ড লাইনের পতাকা সহ --versionবা তাদের সংস্করণ নম্বরটি বলে দেয় -vতবে আউটপুট ফর্ম্যাটটি পরিবর্তিত হয় এবং প্রোগ্রাম্যালি সংস্করণ নম্বরটি বাছাই করা কঠিন হতে পারে। তারপরে সম্ভবত একই প্রোগ্রামটির বেশ কয়েকটি সংস্করণ একই সাথে ইনস্টল করার বিষয়টি রয়েছে।

দ্বিতীয়টি সংস্করণ সংখ্যাগুলির বিন্যাসের কিছু জ্ঞানের উপর নির্ভর করে। দেবিয়ান -স্টাইলের সংস্করণ নম্বরগুলিdpkg তুলনা করতে পারে (যা আমি মনে করি সেমভার টাইপ সংস্করণগুলি উপসেট হিসাবে অন্তর্ভুক্ত করে ):

if dpkg --compare-versions 4.3.30 ge 4.0.0 ; then
    echo "it's version 4.x"
fi

বা, কেবল উপরের একত্রিত করতে:

bashver=$( bash --version | sed -Ee 's/GNU bash, version ([0-9.]+).*/\1/;q' )
if dpkg --compare-versions "$bashver" ge 4.0.0 ; then
    echo "'bash' in your path is version 4.x"
fi

5

আপনি যা অর্জন করতে চান তার কাছে যাওয়ার কয়েকটি উপায় রয়েছে।

1. $ BASH_VERSION ব্যবহার করুন

$BASH_VERSIONপরিবর্তনশীল কী আছে তা দেখার জন্য এটি যথেষ্ট । ব্যক্তিগতভাবে আমি সাবস্কেলটি এর মতো ব্যবহার করতাম:

$ (read -d "." version trash <<< $BASH_VERSION; echo "$version" )
4

নোট করুন যে <<<এখানে-ডকটির জন্য সিনট্যাক্সটি পোর্টেবল নয়, যদি আপনি এটি ব্যবহার করে যাচ্ছেন /bin/shযা উবুন্টুতে ড্যাশ এবং অন্য কোনও সিস্টেমে অন্য কিছু হতে পারে

বিকল্প উপায় কেস স্টেটমেন্ট বা যদি বিবৃতি মাধ্যমে হয়। ব্যক্তিগতভাবে, আমি এটি করতাম:

bash-4.3$ case $BASH_VERSION in 4.*) echo "Can use associative arrays";; ?) echo "can't use associative arrays" ;; esac
Can use associative arrays

সম্ভবত বহনযোগ্যতার স্বার্থে, আপনার সম্ভবত পরীক্ষা করা উচিত যে এর মতো পরিবর্তনশীল এমন কোনও কিছু দিয়ে প্রথম স্থানে সেট করা আছে কিনা check [ -n $BASH_VERSION ]

এটি সম্পূর্ণরূপে স্ক্রিপ্টে ব্যবহৃত ফাংশন হিসাবে পুনরায় লেখা যেতে পারে। এর দীর্ঘ লাইন কিছু:

#!/bin/bash
version_above_4(){
    # check if $BASH_VERSION is set at all
    [ -z $BASH_VERSION ] && return 1

    # If it's set, check the version
    case $BASH_VERSION in 
        4.*) return 0 ;;
        ?) return 1;; 
    esac
}

if version_above_4
then
    echo "Good"
else
    echo "No good"
fi

এটি ওয়ান-লাইনার নয়, যদিও এটি আরও ভাল। পরিমাণের তুলনায় মান.

2. কি ইনস্টল করা আছে তা পরীক্ষা করুন

তার জন্য আপনাকে এর apt-cache policyমতো আউটপুট ফিল্টার করতে হবে

$ apt-cache policy bash | awk -F '[:.]' '/Installed:/{printf "%s\n",substr($2,2)}'
4

dpkg-queryকিছু ফিল্টারিং এর মাধ্যমেও কাজে আসতে পারে awk

$ dpkg-query -W bash | awk '{print substr($2,1,1)}'   
4

মনে রাখবেন এটি পোর্টেবল নয়, যেহেতু কোনও সিস্টেমে কোনও ইনস্টল dpkgবা aptইনস্টলড নেই (উদাহরণস্বরূপ, আরএইচইল বা ফ্রিবিএসডি), এটি আপনার কোনও ভাল করবে না।

৩. যদি কোনও ত্রুটি থাকে তবে স্ক্রিপ্ট থেকে প্রস্থান করতে সেট-ই ব্যবহার করুন

এটিকে ঘুরে দেখার এক উপায় হ'ল কেবলমাত্র ব্যবহারের জন্য সাহচর্যমূলক অ্যারেগুলি এগিয়ে যান এবং যখন bashসেগুলি ব্যবহার না করা যায় তখন ত্যাগ করুন। স্ক্রিপ্টটি সহযোগী অ্যারে ব্যবহার করতে না পারলে set -eনীচের লাইনটি #!/bin/bashস্ক্রিপ্টটি ছাড়তে দেবে।

এটির জন্য আপনাকে ব্যবহারকারীকে স্পষ্টভাবে বলতে হবে: "আরে, আপনার সত্যিকারের বাশ সংস্করণ ৪.৩ বা তার বেশি প্রয়োজন, অন্যথায় স্ক্রিপ্টটি কাজ করবে না"। তারপরে দায়বদ্ধতা ব্যবহারকারীর উপর নির্ভর করে, যদিও কারও কারও পক্ষে যুক্তি হতে পারে যে এটি সত্যই সফ্টওয়্যার বিকাশের পক্ষে ভাল পদ্ধতির নয়।

৪. সমস্ত আশা ত্যাগ করুন এবং পোর্টেবল, পসিক্স-কমপ্লায়েন্ট স্ক্রিপ্ট লিখুন

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


আপনি ৪ র্থ বিভাগে যেমন পরামর্শ দেন অ্যারেওয়েটিভ অ্যারে হ'ল "দুটি অ্যারে" এর দ্বিতীয় It's এটির একমাত্র উদ্দেশ্য মূল "প্যাথ / টু / ফাইল-নাম" রাখা এবং মানটি মূল অ্যারের মধ্যে সূচক। নিয়মিত ইনডেক্সড অ্যারেগুলিতে অনুসন্ধানগুলি গতি বাড়ানোর জন্য এ্যাসোসিয়েটিভ অ্যারে তৈরি করা হয়েছিল যা বর্তমানে ক্রমযুক্ত। যদিও পাইথনে আমার নজর আছে তবে আমার বর্তমান বাশ সামঞ্জস্যতা উবুন্টু এবং সম্ভবত উইন্ডোজ 10 এর জন্য ব্যাশকে কেন্দ্র করে I আমি আপনার স্ক্রিপ্টটি পছন্দ করি যা সিলেক্ট করা যায়। উদাহরণস্বরূপ yad --versionরিটার্ন 0.37.0 (GTK+ 3.18.9)কিন্তু নতুন বৈশিষ্ট্যগুলি বর্তমানে রয়েছে 0.39
উইনউইউউকস 2 ইউনিক্স 20'17

দুর্দান্ত এবং সহায়ক উত্তর। ধন্যবাদ!
কোডেনিনজা

2

ওয়ান-লাইনার সম্ভব নয় তবে একটি ব্যাশ স্ক্রিপ্ট সম্ভব

আমি একটি স্ক্রিপ্ট তৈরি করেছি যা স্ট্যাক ওভারফ্লোতে উত্তরগুলি আঁকবে। এই উত্তরগুলির মধ্যে একটি ডেল কর্মচারী রেকর্ডিং সংস্করণ নম্বর তুলনা করেছে 2004 সালে DKMS আবেদনের জন্য।

কোড

কমান্ডটি ব্যবহার করে নীচে ব্যাশ স্ক্রিপ্টটি এক্সিকিউটেবল হিসাবে চিহ্নিত করা দরকার chmod a+x script-name। আমি নামটি ব্যবহার করছি /usr/local/bin/testver:

#!/bin/bash

# NAME: testver
# PATH: /usr/local/bin
# DESC: Test a program's version number >= to passed version number
# DATE: May 21, 2017. Modified August 5, 2019.

# CALL: testver Program Version

# PARM: 1. Program - validated to be a command
#       2. Version - validated to be numberic

# NOTE: Extracting version number perl one-liner found here:
#       http://stackoverflow.com/questions/16817646/extract-version-number-from-a-string

#       Comparing two version numbers code found here:
#       http://stackoverflow.com/questions/4023830/how-compare-two-strings-in-dot-separated-version-format-in-bash

# Map parameters to coder-friendly names.
Program="$1"
Version="$2"

# Program name must be a valid command.
command -v $Program >/dev/null 2>&1 || { echo "Command: $Program not found. Check spelling."; exit 99; }

# Passed version number must be valid format.
if ! [[ $Version =~ ^([0-9]+\.?)+$ ]]; then
    echo "Version number: $Version has invalid format. Aborting.";
    exit 99
fi

InstalledVersion=$( "$Program" --version | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/' )
# echo "Installed Version: $InstalledVersion"

if [[ $InstalledVersion =~ ^([0-9]+\.?)+$ ]]; then
    l=(${InstalledVersion//./ })
    r=(${Version//./ })
    s=${#l[@]}
    [[ ${#r[@]} -gt ${#l[@]} ]] && s=${#r[@]}

    for i in $(seq 0 $((s - 1))); do
        # echo "Installed ${l[$i]} -gt Test ${r[$i]}?"
        [[ ${l[$i]} -gt ${r[$i]} ]] && exit 0 # Installed version > test version.
        [[ ${l[$i]} -lt ${r[$i]} ]] && exit 1 # Installed version < test version.
    done

    exit 0 # Installed version = test version.
else
    echo "Invalid version number found for command: $Program"
    exit 99
fi

echo "testver - Unreachable code has been reached!"
exit 255
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.