Bash: var null in a condition - bash

Here is the example:
$ credits="29" ; echo "C=$credits" ; initial="1064" ; echo "C=$credits" ; limit=`expr $initial / 10` ; echo "C=$credits" ; if [ "$credits" -le "$limit" ] && [ ! "$initial" -eq "50" ] ; echo "C=$credits" ; then echo "C=$credtis" ; fi ; echo "C=$credits" ; echo "I=$initial"
C=29
C=29
C=29
C=29
C=
C=29
I=1064
$ c="29" ; echo "C=$c" ; initial="1064" ; echo "C=$c" ; limit=`expr $initial / 10` ; echo "C=$c" ; if [ "$c" -le "$limit" ] && [ ! "$initial" -eq "50" ] ; echo "C=$c" ; then echo "C=$c" ; fi ; echo "C=$c" ; echo "I=$initial"
C=29
C=29
C=29
C=29
C=29
C=29
I=1064
When var name is "c", everything is ok, but when it's "credits", I can't use var content in the if condition.
Don't understand why...

Your problem is an incorrectly formatted if expression in both lines of code. Specifically, the first line includes an incorrect echo "C=$credits" ; between the end of the if and the then:
if [ "$credits" -le "$limit" ] && [ ! "$initial" -eq "50" ] ; echo "C=$credits" ; then
should be:
if [ "$credits" -le "$limit" ] && [ ! "$initial" -eq "50" ] ; then
echo "C=$credtis"
fi
The same error is repeated here:
if [ "$credits" -le "$limit" ] && [ ! "$initial" -eq "50" ] ; echo "C=$credits" ; then
should be
if [ "$credits" -le "$limit" ] && [ ! "$initial" -eq "50" ] ; then
echo "C=$credtis"
fi

Related

I'm using this shell script to identify the maximum and minimum of the performed arithmetic operation but facing issue with float value in if block

read -p "enter first number : " a
read -p "enter second number : " b
read -p "enter third number : " c
if [ $b -gt 0 ]
then
w=`echo $a $b $c | awk '{print $1+$2*$3}'`;
echo $w;
x=`echo $a $b $c | awk '{print $1%$2+$3}'`
echo $x
y=`echo $c $a $b | awk '{print $1+$2/$3}'`
echo $y
z=`echo $a $b $c | awk '{print $1*$2+$3}'`
echo $z
if [ $w -gt $x ] && [ "($w -gt $y | bc)" ] && [ $w -gt $z ]
then
echo $w"w"
elif [ $x -gt $w ] && [ "( $x -gt $y | bc )" ] && [ $x -gt $z ]
then
echo $x"x"
elif [ $z -gt $w ] && [ $z -gt $x ] && [ "($z -gt $y | bc)" ]
then
echo $z"z"
else
echo $y"y"
fi
if [ $w -lt $x ] && [ "( $w -lt $y | bc )" ] && [ $w -lt $z ]
then
echo $w"w"
elif [ $x -lt $w ] && [ "( $x -lt $y | bc )" ] && [ $x -lt $z ]
then
echo $x"x"
elif [ $z -lt $w ] && [ $z -lt $x ] && [ "($z -lt $y | bc )" ]
then
echo $y"y"
else
echo $z"z"
fi
fi

script for testing if number is in interval

I am trying to test if a number is in the interval [1;100] here is what I did:
var=10
if [ $["$var" -gt "1" ] -a $["$var" -lt "100"] ] ; then
echo "yes"
else
echo "no"
fi
however when I run the script I get the error message:
./yourscript:line 2 10 -gt 1:error syntax in expression ,any ideas why?
delete unnecessaries and use &&:
var=10
if [ $var -gt 1 ] && [ $var -lt 100 ] ; then #or with -a if [ $var -gt 1 -a $var -lt 100 ] ;
echo "yes"
else
echo "no"
fi

How do I find the middle of three numbers in shell script

#!/bin/bash
echo "Enter three numbers and this program will give you the middle number : " ; read num1 ; read num2 ; read num3
if [ "$num1" -gt "$num2" ] && [ "$num1" -lt "$num3" ] || [ "$num1" -lt "$num2" ] && [ "$num1" -gt "$num3" ]; then
{
echo "The middle number is $num1"
}
elif [ "$num2" -gt "$num1" ] && [ "$num2" -lt "$num3" ] || [ "$num2" -lt "$num1" ] && [ "$num2" -gt "$num3" ]; then
{
echo "The middle number is $num2"
}
elif [ "$num3" -gt "$num1" ] && [ "$num3" -lt "$num2" ] || [ "$num3 -lt "$num1" ] && [ "$num3" -gt "$num2" ]; then
{ echo "The middle number is $num3" }
fi
The problem I have is with the or condition. I input the numbers 1, 2, and 3, but I get the middle number as 1 all the time.
How about this:
getmid() {
if (( $1 <= $2 )); then
(( $1 >= $3 )) && { echo $1; return; }
(( $2 <= $3 )) && { echo $2; return; }
fi;
if (( $1 >= $2 )); then
(( $1 <= $3 )) && { echo $1; return; }
(( $2 >= $3 )) && { echo $2; return; }
fi;
echo $3;
}
# All permutations of 1, 2 and 3 print 2.
getmid 1 2 3
getmid 2 1 3
getmid 1 3 2
getmid 3 1 2
getmid 2 3 1
getmid 3 2 1
This one should work:
#!/bin/bash
echo "Enter three numbers and this program will give you the middle number : " ; read num1 ; read num2 ; read num3;
if [ "$num1" -gt "$num2" ] && [ "$num1" -lt "$num3" ]; then
{
echo "The middle number is" $num1 ;
}
elif [ "$num1" -lt "$num2" ] && [ "$num1" -gt "$num3" ]; then
{
echo "The middle number is" $num1 ;
}
elif [ "$num2" -gt "$num1" ] && [ "$num2" -lt "$num3" ]; then
{
echo "The middle number is" $num2 ;
}
elif [ "$num2" -lt "$num1" ] && [ "$num2" -gt "$num3" ]; then
{
echo "The middle number is" $num2 ;
}
elif [ "$num3" -gt "$num1" ] && [ "$num3" -lt "$num2" ]; then
{
echo "The middle number is" $num3 ;
}
elif [ "$num3" -lt "$num1" ] && [ "$num3" -gt "$num2" ]; then
{
echo "The middle number is" $num3 ;
}
fi

Statement True Even if Time is Different

I've been working on a bash script to change my background depending on the time of day but I can't figure out why the background is always changed to dawn even if the time is Noon.
#!/bin/bash
date=$(date "+%H")
DawnNum=$(seq -s " -o " 5 9)
DayNum=$(seq -s " -o " 10 17)
DuskNum=$(seq -s " -o " 18 22)
NightNum=$(seq -s " -o " 23 24)
NightNumCont=$(seq -s " -o " 0 4)
if
[ -e ~/.cache/weather.txt ] ;
then
rm ~/.cache/weather.txt ;
else
echo "Cache is clean." ;
fi
curl -o ~/.cache/weather.txt -s "https://weather.yahooapis.com/forecastrss?w=2470169&u=f" ;
cat ~/.cache/weather.txt | grep Rain -n | grep 29 || cat ~/.cache/weather.txt | grep Snow -n | grep 29 ;
current=$?
if
[ "$current" -eq 0 ] && [ "$date" -eq $DawnNum -o $DayNum ] ; then
gsettings set org.cinnamon.desktop.background picture-uri "file:///home/user/Pictures/Google Now/mountains-stormday.png" ;
elif
[ "$current" -eq 0 ] && [ "$date" -eq $DuskNum -o $NightNum ] ; then
gsettings set org.cinnamon.desktop.background picture-uri "file:///home/user/Pictures/Google Now/mountains-stormnight.png" ;
elif
[ "$current" -ne 0 ] && [ "$date" -eq $DawnNum ] ; then
gsettings set org.cinnamon.desktop.background picture-uri "file:///home/user/Pictures/Google Now/mountainsdawn.png" ;
elif
[ "$current" -ne 0 ] && [ "$date" -eq $DayNum ] ; then
gsettings set org.cinnamon.desktop.background picture-uri "file:///home/user/Pictures/Google Now/mountainsday.png" ;
elif
[ "$current" -ne 0 ] && [ "$date" -eq $DuskNum ] ; then
gsettings set org.cinnamon.desktop.background picture-uri "file:///home/user/Pictures/Google Now/mountainsdusk.png" ;
elif
[ "$current" -ne 0 ] && [ "$date" -eq $NightNum ] ; then
gsettings set org.cinnamon.desktop.background picture-uri "file:///home/user/Pictures/Google Now/mountainsnight.png" ;
else
gsettings set org.cinnamon.desktop.background picture-uri "file:///home/user/Pictures/Google Now/sanfranciscodawn.png" ;
fi
exit
I would recommend simplifying your logic and reducing repetition in your code. As you are using bash and working with integers, you can use (( )) numerical tests to determine what time range you are within. This kind of test doesn't require you to use $ variable names and expresses your meaning a little more clearly:
#!/bin/bash
date=$(date "+%H")
dawn_start=5
day_start=10
dusk_start=18
night_start=23
# ...
current=$?
if [[ "$current" == 0 ]]; then
if (( date >= dawn_start )) && (( date < dusk_start )); then
uri="mountains-stormday.png"
else
uri="mountains-stormnight.png"
fi
else
if (( date >= dawn_start )) && (( date < day_start )); then
uri="mountainsdawn.png"
elif (( date >= day_start )) && (( date < dusk_start )); then
uri="mountainsday.png"
elif (( date >= dusk_start )) && (( date < night_start )); then
uri="mountainsdusk.png"
elif (( date >= night_start )) || (( date < dawn_start )); then
uri="mountainsnight.png"
fi
fi
# catch-all, if $uri hasn't been set
[[ -z "$uri" ]] && uri="sanfranciscodawn.png"
dir="file:///home/user/Pictures/Google Now"
gsettings set org.cinnamon.desktop.background picture-uri "$dir/$uri"
This doesn't do what you expect:
[ "$date" -eq $DawnNum -o $DayNum ]
The problem is that -eq binds more tightly than -o.
A simpler test that might do what you are aiming for is:
[ "$date" -ge 5 ] && [ "$date" -le 17 ]

BASH function: syntax error near unexpected token `'2''

I am completely lost as to why this error keeps happening, I am fairly certain that I am using the correct syntax, however, every time I execute this BASH script, I get the following error:
/home/clucky/MCServerBackup/MCServerBackup.sh: line 200: syntax error near unexpected token `'2''
/home/clucky/MCServerBackup/MCServerBackup.sh: line 200: ` logInfo() '2' "none" "Minecraft: $minecraftsize.$minecraftsized $minecraftunit"'
The line in particular that it appears to be refrencing is line 200, which is where the code attempts to execute the function logInfo() as follows:
logInfo() '2' "none" "Minecraft: $minecraftsize.$minecraftsized $minecraftunit"
In the above line of code, 2 is the indent level (2 x 5 spaces). none tells the function to ignore the logLevel that is specified in the configuration and log it anyway. Minecraft: $minecraftsize...$minecraftunit is what is being added into the log file, which the words preceeded by a $ are of course variables. The entire code can be viewed below.
#! /usr/bin/env bash
#Declare Functions
logInfo() {
if [ "$logInFile" == "true" ] || [ "$logInConsole" == "true" ] ; then
let tabAmount=5*$1
indent=""
for (( indentrepeat=0; indentrepeat < $tabAmount; indentrepeat++ ))
do
indent="$indent "
done
if [ "$2" == "none" ] ; then
infoItem="$3"
else
if [ "$logLevel" == "high" ] ; then
if [ "$2" == "subtask" ] ; then
#High + Subtask
infoItem="`date '+%H:%M:%S'` $3"
elif [ "$2" == "task" ] ; then
#High + Task
infoItem="`date '+%H:%M:%S'` $3"
fi
elif [ "$logLevel" == "medium" ] ; then
if [ "$2" == "subtask" ] ; then
#Medium + Subtask
infoItem="$3"
elif [ "$2" == "task" ] ; then
#Medium + Task
infoItem="`date '+%H:%M:%S'` $3"
fi
else
if [ "$2" == "subtask" ] ; then
#Low + Subtask
infoItem=''
elif [ "$2" == "task" ] ; then
#Low + Task
infoItem="$3"
fi
fi
fi
if [ "$logInFile" == "true" ] ; then
echo -e "$indent$infoItem" >> backup.log
fi
if [ "$logInConsole" == "true" ] ; then
echo -e "$indent$infoItem"
fi
fi
}
logError() {
if [ "$logInFile" == "true" ] || [ "$logInConsole" == "true" ] ; then
let tabAmount=5*$1
indent=""
for (( indentrepeat=0; indentrepeat < $tabAmount; indentrepeat++ ))
do
indent="$indent "
done
if [ "$logInFile" == "true" ] && [ "$logErrors" == "true" ] ; then
echo -e "$indent[ERROR] $2" >> backup.log
fi
if [ "$logInConsole" == "true" ] && [ "$logErrors" == "true" ] ; then
echo -e "$indent[ERROR] $2"
fi
fi
}
#Set Variables
source config.sh
minecraftsize=0
sqlsize=0
websitesize=0
timedate=`date '+%m.%d.%Y-%H:%M'`
#Update
if [ $version != "1.0.0" ] ; then
source update.sh
fi
#Trigger General Settings
echo -ne "\033]0;$serverName - Backup\007"
if [ "$serverDirectory" == "default" ] ; then
BINDIR="$(dirname "$(readlink -fn "$0")")"
cd "$BINDIR"
else
if [ -d "$serverDirectory" ] ; then
cd "$serverDirectory"
else
directoryExists=false
echo '$serverDirectory defined as '"$serverDirectory"' does not exist. Please double check your configuration and make sure this folder exists.'
if [ "$logInFile" == "true" ] ; then
echo "-------------- `date '+%d-%B-%Y %H:%M'` --------------" >> backup.log
echo -e ' [ERROR] $serverDirectory defined as '"$serverDirectory"', does not exist. Please double check your configuration and make sure this folder exists.'"\n" >> backup.log
fi
fi
fi
if [ "$purgeFiles" == "true" ] || [ "$backupMinecraft" == "true" ] || [ "$backupMySQL" == "true" ] || [ "$backupWebsite" == "true" ] && [ "$directoryExists" != "false" ] ; then
echo "-------------- `date '+%d-%B-%Y %H:%M'` --------------" >> backup.log
#Create Directories
echo "[`date '+%H:%M:%S'`] Directory Creation Started" >> backup.log
if [ ! -d ".backups" ] ; then
mkdir -p .backups
fi
mkdir -p .backups/$timedate
if [ "$backupMySQL" == "true" ] ; then
mkdir -p .backups/$timedate/MySQL
fi
if [ "$backupWebsite" == "true" ] ; then
mkdir -p .backups/$timedate/Website
fi
if [ "$backupMinecraft" == "true" ] ; then
mkdir -p .backups/$timedate/MinecraftServers
fi
echo "[`date '+%H:%M:%S'`] Directory Creation Completed" >> backup.log
#Backup Minecraft Servers
if [ "$backupMinecraft" == "true" ] ; then
echo "[`date '+%H:%M:%S'`] Minecraft Backup Started" >> backup.log
for (( servercount = 0; servercount < ${#mcservers[#]}; servercount++ ))
do
echo " ${mcservers[servercount]}" >> backup.log
tar -zcpf .backups/$timedate/MinecraftServers/${mcservers[servercount]}.tar.gz --directory ${mcservers[servercount]} ${fileexcludes[servercount]} .
minecraftsize=`expr $minecraftsize + $(ls -la .backups/$timedate/MinecraftServers/${mcservers[servercount]}.tar.gz | awk '{ print $5}')`
done
echo "[`date '+%H:%M:%S'`] Minecraft Backup Completed" >> backup.log
fi
#Copy MySQL Databases
if [ "$backupMySQL" == "true" ] ; then
echo "[`date '+%H:%M:%S'`] MySQL Backup Started" >> backup.log
for (( sqlcount = 0; sqlcount < ${#sqldatabases[#]}; sqlcount++ ))
do
if [[ "${sqldatabases[sqlcount]}" =~ # ]] ; then
sqldatabases[sqlcount]=${sqldatabases[sqlcount]//[#]/}
mysqldump -u"$sqluser" -p"$sqlpass" -h"$sqlhost" ${sqldatabases[sqlcount]} > .backups/$timedate/MySQL/${sqldatabases[sqlcount]}.sql;
sqlsize=`expr $sqlsize + $(ls -la .backups/$timedate/MySQL/${sqldatabases[sqlcount]}.sql | awk '{ print $5}')`
echo " ${sqldatabases[sqlcount]}*" >> backup.log
else
mysqldump -u"$sqluser" -p"$sqlpass" -h"$sqlhost" --skip-lock-tables ${sqldatabases[sqlcount]} > .backups/$timedate/MySQL/${sqldatabases[sqlcount]}.sql;
sqlsize=`expr $sqlsize + $(ls -la .backups/$timedate/MySQL/${sqldatabases[sqlcount]}.sql | awk '{ print $5}')`
echo " ${sqldatabases[sqlcount]}" >> backup.log;
fi
done
fi
#Backup Website
if [ "$backupWebsite" == "true" ] ; then
echo "[`date '+%H:%M:%S'`] Website Backup Started" >> backup.log
if [ "$websiteDirectory" == "default" ] ; then
websiteDirectory=var/www/
fi
if [ -d "$websiteDirectory" ] ; then
tar -zcpf .backups/$timedate/Website/website.tar.gz --directory $websiteDirectory $websiteExcludes .
echo "[`date '+%H:%M:%S'`] Website Backup Completed" >> backup.log
else
logError "5" "\0044websiteDirectory defined as $websiteDirectory does not exist. Please double check your configuration and make sure this folder exists."
echo "[`date '+%H:%M:%S'`] Website Backup Cancelled" >> backup.log
fi
fi
#Purge files 3 days old
if [ "$purgeFiles" == "true" ] ; then
echo "[`date '+%H:%M:%S'`] Purging Old Backups" >> backup.log
find .backups* -mmin +$purgeTime -exec rm --recursive {} \;
echo "[`date '+%H:%M:%S'`] Purging Complete" >> backup.log
fi
#Read back file size
let filesize=$minecraftsize+$sqlsize+$websitesize
if [ "$filesize" -ge 1024 ] ; then
if [ "$filesize" -ge 1048576 ] ; then
if [ "$filesize" -ge 1073741824 ] ; then
filedivider=1073741824
fileunit="GB"
else
filedivider=1048576
fileunit="MB"
fi
else
filedivider=1024
fileunit="KB"
fi
else
filedivider=1
fileunit="Bytes"
fi
let filesized='(''('$filesize%$filedivider')'*100')'/$filedivider
let filesize=$filesize/$filedivider
echo " Total Compression Size: $filesize.$filesized $fileunit" >> backup.log
if [ "$backupMinecraft" == "true" ] ; then
if [ "$minecraftsize" -ge 1024 ] ; then
if [ "$minecraftsize" -ge 1048576 ] ; then
if [ "$minecraftsize" -ge 1073741824 ] ; then
minecraftdivider=1073741824
minecraftunit="GB"
else
minecraftdivider=1048576
minecraftunit="MB"
fi
else
minecraftdivider=1024
minecraftunit="KB"
fi
else
minecraftdivider=1
minecraftunit="Bytes"
fi
let minecraftsized='(''('$minecraftsize%$minecraftdivider')'*100')'/$minecraftdivider
let minecraftsize=$minecraftsize/$minecraftdivider
logInfo() '2' "none" "Minecraft: $minecraftsize.$minecraftsized $minecraftunit"
fi
if [ "$backupMySQL" == "true" ] ; then
if [ "$sqlsize" -ge 1024 ] ; then
if [ "$sqlsize" -ge 1048576 ] ; then
if [ "$sqlsize" -ge 1073741824 ] ; then
sqldivider=1073741824
sqlunit="GB"
else
sqldivider=1048576
sqlunit="MB"
fi
else
sqldivider=1024
sqlunit="KB"
fi
else
sqldivider=1
sqlunit="Bytes"
fi
let sqlsized='(''('$sqlsize%$sqldivider')'*100')'/$sqldivider
let sqlsize=$sqlsize/$sqldivider
echo " MySQL: $sqlsize.$sqlsized $sqlunit" >> backup.log
fi
if [ "$backupWebsite" == "true" ] ; then
if [ "$websitesize" -ge 1024 ] ; then
if [ "$websitesize" -ge 1048576 ] ; then
if [ "$websitesize" -ge 1073741824 ] ; then
websitedivider=1073741824
websiteunit="GB"
else
websitedivider=1048576
websiteunit="MB"
fi
else
websitedivider=1024
websiteunit="KB"
fi
else
websitedivider=1
websiteunit="Bytes"
fi
let websitesized='(''('$websitesize%$websitedivider')'*100')'/$websitedivider
let websitesize=$websitesize/$websitedivider
echo " Website: $websitesize.$websitesized" >> backup.log
fi
echo "" >> backup.log
fi
As I stated earlier, I am completely lost, so any assistance would be greatly appreciated. Thank you!
You don't invoke a function with parentheses. Change:
logInfo() '2' "none" "Minecraft: $minecraftsize.$minecraftsized $minecraftunit"
to
logInfo '2' "none" "Minecraft: $minecraftsize.$minecraftsized $minecraftunit"

Resources