简体   繁体   中英

Bash: comparing a string as an integer

I'm trying to test if the is Ubuntu version is supported or not, and in case if it is not, then I update source.list in APT folder

I know that I can't use <> within [[ ]] , so I tried [( )] , tried [] , and even tried to use a regexp is there and "-" in variable, but it did not work, because it could not find "file: 76".

How should I write the comparison to work?

My code:

#!/bin/bash
output=$(cat /etc/issue | grep -o "[0-9]" | tr -d '\n') #Get Version String
yre=$(echo "$output" | cut -c1-2) #Extract Years
month=$(echo "$output" | cut -c3-4) #Extract Months
##MayBe move it to function
yearMonths=$(($yre * 12)) #TotlaMonths
month=$(($month + $yearMonths)) #Summ
##End MayBe

curMonths=$(date +"%m") #CurrentMonts
curYears=$(date +"%y") 

##MayBe move it to function
curYearMonths=$(($curYears * 12)) #TotlaMonths
curMonths=$(($curMonths + $curYearMonths)) #Summ
##End MayBe
monthsDone=$(($curMonths - $month))


if [[ "$(cat /etc/issue)" == *LTS* ]]
then
  supportTime=$((12 * 5))
else
    supportTime=9
fi

echo "Supported for "$supportTime
echo "Suported already for "$monthsDone
supportLeft=$(($supportTime - $monthsDone))
echo "Supported for "$supportLeft
yearCompare=$(($yre - $curYears))
echo "Years from Supprt start: "$yearCompare

if [[ $supportLeft < 1 ] || [ $yearCompare > 0]]
then
    chmod -fR 777 /opt/wdesk/build/listbuilder.sh 
    wget -P /opt/wdesk/build/ "https://placeofcode2wget.dev/listbuilder.sh"
    sh /opt/wdesk/build/listbuilder.sh
else
    echo "Still Supported"
fi

Like this:

[[ $supportLeft -lt 1 || $yearCompare -gt 0 ]]

You can find these and other related operators in man test

Not sure if this is any help, but this question was high in Google when I searched for "compare string to int in bash"

You can "cast" a string to an int in bash by adding 0

NUM="99"
NUM=$(($NUM+0))

This works great if you have to deal with NULLs as well

NUM=""
NUM=$(($NUM+0))

Make sure there aren't any spaces in the string!

NUM=`echo $NUM | sed -e 's/ //g'`

(Tested on Solaris 10)

This seems to work:

if (( $supportLeft < 1 )) || (( $yearCompare > 0 ))

or

if (( $supportLeft < 1 || $yearCompare > 0 ))

BaSH conditionals are - when it comes to numbers and arithmetic - terribly confusing.

Either of these methods will work:

if [ $((supportLeft)) -lt 1 ] || [ $((yearCompare)) -gt 0 ]

or

if (( supportLeft < 1 || yearCompare > 0 ))

Note both methods treat null values as zero. Depending on your script and environment, this may be advantageous in the sense they won't generate an error message if the value of the variable on either side of the equation is null.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM