BubbleSort Bash is not sorting - bash

My bubble sort code in bash script does not swap nor sort. Help me out on what I am doing wrong.
echo "Enter numbers between 4 and 12"
read n
#declare -a numArray #declare array of numbers
if [ $n -le 12 -a $n -ge 4 ]
then
#take input from user
echo "Enter numbers of array"
for (( i = 0; i < $n; i++ ))
do
read numArray[$i]
done
#sorting logic
for (( i = 0; i < $n; i++ ))
do
for (( j = 0; j < $n-1; j++ ))
do
# swapping logic
#read numArray[$j]
if [[ ${numArray[j]} -gt ${numArray[$((j+1))]} ]]
then
#echo "in swapping code"
temp=${numArray[j]}
echo $temp
numArray[$j]=${numArray[$((j+1))]}
numArray[$((j+1))]=$temp
fi
done
done
# print sorted data
echo -e "\nSorted Numbers "
echo "${numArray[*]}"
else
echo "Please enter only values between 4 and 12"
fi
Result:
Enter numbers between 4 and 12
5
Enter numbers of array
51428
51428
51428
51428
51428
Sorted Numbers
51428

Related

How to break while loop after 5 attempts?

How to keep track of how many guesses the user makes and print a message that tells them they lose? Exit after 5 guesses.
num=$(( $RANDOM % 100 + 1 ))
while [ "$input" -ne "$num" ]; do
if [ "$input" -gt "$num" ]; then
echo "The number is too high."
read input
elif [ "$input" -lt "$num" ]; then
echo "The number is too low."
read input
fi
done
echo "Great, you picked the right number."
Would you please try the following:
#!/bin/bash
num=$(( $RANDOM % 100 + 1 ))
for (( i = 0; i < 5; i++ )); do
read -p "Enter a number: " input
if (( input == num )); then
echo "Great, you picked the right number."
break
elif (( input > num )); then
echo "The number is too high."
elif (( input < num )); then
echo "The number is too low."
fi
done
BTW I tested the script by modifying the random number generator to $RANDOM % 10 + 1 but still not easy :).

Problem in shell code to find happy prime number

This is my code to find happy prime number, I don't know why it is giving error.
#!/bin/bash
happy(){
rem = $0
sum = $0
while [ $result -gt 0 ];
do
rem = $((result%10))
p = $((rem*rem))
sum = $((sum + p))
result = $((result/10))
done
return $sum
}
echo "Enter a number"
read num
for (( i=1; i<101; i++ ))
do
result=$i
while [ $result -ne 0 && $result -ne 4 ];
do
happy $result
done
if [ $?==1 ]
then echo "happy number"
else
echo "not a happy number"
fi
done
I see lots of syntax errors and some logical errors in your script.
This should be a fixed version (works at least for 13 and 4 :))
Errors I've found:
rem = $0 and similar: the spaces around assignments are not allowed in bash,
rem = $0: you assign a value that is never used,
rem = $0 and sum = $0 the first argument passed to the function is $1 not $0,
the input number is assigned to num but never used,
the exit condition from the for and while loops is broken,
...
#!/bin/bash
happy()
{
result=$1
sum=0
while [ $result -gt 0 ]; do
rem=$(( result % 10 ))
p=$(( rem * rem ))
sum=$(( sum + $p ))
result=$(( result / 10 ))
done
echo "$sum"
}
echo "Enter a number"
read num
result=$num
for (( i=1; i<101; i++ )) do
result=$(happy $result)
if [ $result == 1 ]; then
echo "$num is a happy number"
exit
fi
done
echo "$num is not a happy number"

storing the contents or a for loop into an array and then retrieving it for if statements

I'm having a bit of trouble, id like to store the contents of the values from my for loop into an array or something and then recall these values to be tested against the if statements and then printed accordingly. My current code gives me a good output however if I use large numbers like 1 and 50 as input values it gives me multiple rows of "Divisible by xValue" instead of just one of each value. Thanks in advance
if (( $# > 2 )); then
echo "Only your first two values will be used"
for((i=($1+($1%2));i<($2-3);i+=2));do #for loop lists all even numbers between two input values
if (( i % 7 == 0 )); then #checks if even number divisible by 7
echo " $i : Divisible by 7 " # prints number and labels
elif (( $i % 11 == 0 )); then #else if checks if divisible by 7
echo " $i : Divisible by 11 " #prints number and labels
elif (( $i % 13 == 0 )); then #if divisible by 13
echo " $i : Divisible by 13 "
fi #closes the if statement
printf "%d%s, " "$i"
done
echo "$i"
Use +=() in bash to add a new element into an array.
#! /bin/bash
set -eu
if (( $# > 2 )); then
echo "Only your first two values will be used"
fi
even=()
for ((i=$1; i<=$2; ++i)) ; do
if (( i % 2 == 0 )) ; then
even+=($i)
fi
done
for e in "${even[#]}" ; do
for d in 7 11 13 ; do
if (( e % d == 0 )); then
echo "$e: Divisible by $d"
break
fi
done
printf "%d%s, " "$e"
done

how to print prime numbers using for loop in shell script

I want to print prime numbers using for loop in shell script. Please provide some suggestions.
actually I could able to print odd numbers from range of 1 to 100, but now I am unable to print prime numbers. Provide some script to print prime numbers
# cat prime.sh
#!/bin/bash
for ((i=1; i<=100; i++))
do
output=$(( $i % 2))
if [ $output -ne 0 ]
then
echo "We got odd numbers: $i"
fi
done
The below code returns the list of prime numbers within a specified range.
the below command returns the prime numbers between 10 to 30
./filename.sh 10 30
#!/bin/bash
# Check if a number is prime
# function to return whether prime or not
check_prime() {
current_number=$1
flag=0
i=2
while test $i -le `expr $current_number / 2`
do
if test `expr $current_number % $i` -eq 0
then
flag=1
fi
i=`expr $i + 1`
done
if test $flag -eq 0
then echo $current_number
fi
}
# Assign From and to number
from_number=$1
to_number=$2
for (( number=$from_number; number<=$to_number; number++ ))
do
check_prime $number
done
This code will Print all prime numbers upto given number & also print count of it
hope it helps !!
#!/bin/bash
echo "enter a number upto which you want the prime numbers"
read num
count=0
for (( n=2; n<=$num; n++ ))
do
t=1
if [ $n -lt 2 ]
then echo "Please give other numbers than 0 and 1"
else
#echo $n
for (( i=2; i<$n; i++ ))
do
#echo $n
if (($n%i==0))
then
#echo "$n is not prime number"
t=0
break;
fi
done
#echo $t
if [ $t == 1 ]
then
echo "$n is a prime number"
count=`expr $count + 1`
fi
fi
done
echo "Total prime numbers upto $num are $count "

How to process value from for loop in shell

I have to a perform logic like this.
I have a array.
expression for this in shell
[(first no + arrlen) - ( index +1 ) - ge 10 ]
I have code this like this but it's not working
#!/bin/bash
array=(4 5 6 7 8 9)
for i in ${array[#]}
do
echo $i
done
echo "${#array[#]}"
l=${#array[#]}
count=0
for (( i=0; i < ${#array[#]}; i++ ))
do
if [ ($(`expr $i + $l`) - $(`expr ${!array[#]} + 1`)) -ge 10 ]
then
count=`expr $count + 1`
else
echo
fi
done
Your code could look like this:
#!/bin/bash
array=(4 5 6 7 8 9)
for i in "${array[#]}"; do
echo "$i"
done
length=${#array[#]}
first=${array[0]}
count=0
for (( i=0; i < length; i++ )); do
if (( (first + length) - (i + 1) >= 10 )); then
((count++))
else
echo "something"
fi
done
Don't use expr, use (( )) for arithmetic expressions
Quote expansions: "$i", "${array[#]}", ...
${!array[#]} expands to ALL indexes of your array, not the current index

Resources