Error getting in the second if statement in bash script - bash

n=20
x=3
count=0
flag=0
i=1
declare -a arr[n+1]
for (( j=0;j<=n;j++ ))
do
arr+=(0)
done
#echo "${arr[#]}"
while [[ $count -ne $n ]]
do
if [[ $i -le $n ]]
then
if [[ ${arr[$i]} -eq '0' ]]
then
echo "Value is ${arr[$i]}"
#${arr[$(i-1)]}= (( ${arr[$i-1]++} ))
${arr[$i]}+=${arr[$i]}
echo " "
#echo -n "${arr[$i]}"
echo -n " $i"
count=$(( count+1 ))
i=$(( i+1+x ))
else
i=$(( i+1 ))
fi
else
i=$(( i-n ))
flag=$(( flag+1 ))
fi
done
echo " "
echo "No of round : $flag"
This is the whole code, I've tried to print numbers that follows this: n=20 is the number of elements and x=3 is the number that we have to avoid. For example,
20
3
1,5,9,13,17,2,6,10,14,18,3,7,11,15,19,4,8,12,16,20,
3
But, the problem is that my second if condition is not fulfilling, if ignores the condition. Above example is for the C++, but in bash script, 2nd if statement isn't working. This can be because syntax is wrong. So can you please help me to find the mistakes.
Output of the above code:
output

${arr[$i]}+=${arr[$i]}
This is incorrect. $ should not be used when you assign the value.
If you want to double the value, replace this string with the following:
arr[$i]=$(( ${arr[$i]} + ${arr[$i]} ))
Or what you want to do there?

Related

Shell Script - Fibonacci

the code below cannot make the fibonacci sequence more than 93 sequences, how can i solve this? I would like you to do with any number
#!/bin/bash
clear
echo "Program to Find Fibonacci Series"
echo "How many number of terms to be generated ?"
read n
x=0
y=1
i=2
echo "Fibonacci Series up to $n terms :"
echo "$x"
echo "$y"
while [ $i -lt $n ]
do
i=`expr $i + 1 `
z=`expr $x + $y `
echo "$z"
x=$y
y=$z
done
You can use the "bc" command (an interactive algebraic language with arbitrary precision) to get past numeric limits of the shell. Here is the re-write of your while loop:
while [[ $i -lt $n ]]
do
i=$(( $i + 1 ))
z=$( bc <<< "$x + $y" )
echo "$z"
x=$y
y=$z
done
On Debian/Ubuntu/RHEL/CentOS systems, install the optional "bc" package.

How to Include Variables in a File Name used in a Variable $File Equals

Why does the echo not return - /lsf10/monitors/lpstat_email_1_vmobius_05122021.txt ?
It returns --> the $FILE
#!/usr/bin/ksh
integer max=3
integer i=1
while [[ $i -lt $max ]]
do
today=`date +%m%d%Y`
FILE = "/lsf10/monitors/lpstat_email_$i_vmobius_$today.txt"
echo "the $FILE"
echo $i
echo "the $FILE"
(( i = i + 1 ))
done
Use ${...} around variables for interpolation inside string literals - it makes things clearer and helps the interpreter.
Indentation helps readability and maintainability.
Try this:
#!/usr/bin/ksh
integer max=3
integer i=1
while (( i < max ))
do
today=`date +%m%d%Y`
FILE="/lsf10/monitors/lpstat_email_${i}_vmobius_${today}.txt"
echo "the $FILE"
echo $i
echo "the $FILE"
(( i ++ ))
done

Why bash consider every character as a number

This is the code:
sum=0
i=1
while [ $i -le $# ]
do
if [[ $i =~ ^[0-9]+$ ]];
then
sum=$(($sum+$(eval echo '$'$(eval echo ${i}))))
echo "$(eval echo '$'$(eval echo $i)) is number"
i=$((i+1))
else
echo "$(eval echo '$'$(eval echo $i)) is not a number"
i=$((i+1))
fi
done
echo "sum is $sum"
and this is the output when I try to distinguish b/w numbers and characters:
$ bash sumOfGivenNums.sh 3 4 3 a
3 is number
4 is number
3 is number
a is number
sum is 10
You've got a lot of really unnecessary code in your script; you almost never want to use the eval function. I would probably write something like this:
sum=0
for arg in "$#"; do
if [[ $arg =~ ^[0-9]+$ ]]; then
echo "$arg is a number"
(( sum += arg ))
else
echo "$arg is not a number."
fi
done
echo "sum is $sum"

How can i loop my bash if statment until it meets the requirement

The code works if you do bash launch_script.sh 5 6 but if i do bash launch_script.sh 6 5 it asks for new start value but it doesn't use it in the script - the script just ends.
#!/bin/bash
a=$1
b=$2
if [ $1 -gt $2 ]
then
echo "$1 is bigger then $2, plz input new start number"
read -p "You're start number will be?: "
else
until [ $a -gt $b ];
do
echo $a
((a++))
done
fi
The loop is not executed, because it's part of the else block. If you want to run the loop always, put it after the end of the if:
#!/bin/bash
a=$1
b=$2
if (( $1 > $2 )) ; then
echo "$1 is bigger then $2, plz input new start number"
read -p "You're start number will be?: " a
fi
until (( $a > $b )) ; do
echo $((a++))
done
To loop over the read statement, just introduce a similar loop:
#!/bin/bash
a=$1
b=$2
while (( $a > $b )) ; do
echo "$1 is bigger then $2, plz input new start number"
read -p "You're start number will be?: " a
done
until (( $a > $b )) ; do
echo $((a++))
done
Note that I fixed several issues in your code:
read can assign the value directly to a variable.
Code should be indented for readability.
I also used the (( arithmetic condition )) syntax which is easier to understand, and included the increment to the echo.

how to extract numbers from this echo into separate variables?

Sorry about bits and snippit of information
So I am writing an average shell script program
so if use inputs
echo 1 3, .... | sh get_number
I would have to pull the numbers seperated by spaces from echo to be
var1 = 1, var2= 3, etc.
I tried
#!/bin/sh
sum=0
for i in $*
do
sum=`expr $sum + $i`
done
avg=`expr $sum / $n`
echo Average=$avg
but doesnt work....
do I include a read here?
also how would I do
sh get_number <file1>, <file2>... to grab numbers in them and sum them
in shell script?
Thanks
Sounds like you are looking for the read shell builtin:
% echo "1 2 3 4" | read a b stuff
% echo $b
2
% echo $stuff
3 4
To fix up your code:
for i in $*; do
sum=$(( sum + i ))
n=$(( n + 1 ))
done
echo "Average=$(( sum / n ))"
#!/bin/sh
while [ $# -gt 0 ]; do
(( i++ ))
(( sum += $1 ))
shift
done
echo "Average=$(( sum/i ))"
Note: This fails in dash which is the closest shell I could find to a real sh.
An example of reading values from files passed as command line arguments or from lines read from stdin:
add_to_sum() {
set $*
while [ $# -gt 0 ]; do
I=`expr $I + 1`
SUM=`expr $SUM + $1`
shift
done
}
I=0
SUM=0
if [ $# -gt 0 ]; then
# process any arguments on the command line
while [ $# -gt 0 ]; do
FILE=$1
shift
while read LINE; do
add_to_sum "$LINE"
done < "$FILE"
done
else
# if no arguments on the command line, read from stdin
while read LINE; do
add_to_sum "$LINE"
done
fi
# be sure not to divide by zero
[ $I -gt 0 ] && echo Average=`expr $SUM / $I`

Resources