Bash syntax error operand expected error token is

I have the following bash script # 1 + x^2/2! + x^4/4! + ... + x^(2n)/(2*n)! #!/bin/bash factorial() { n=$1 fact=1 for ((i = 2; i <= $n; i++)); do fact=$(expr $fact * $i) ...

The error message is caused by the line a=$(($ex / $f)), because there is no operand following the / (divide) operator. So the immediate suspicion is that the variable f is an empty string.

The cause of that is the behaviour of the $( ) command substitution when f is assigned. This collects the contents of stdout when the enclosed command pipeline is executed. As your factorial() function writes nothing to stdout, the value assigned to f is empty. The solution is to echo or print the value, in place of the return — e.g. as printf '%sn' "${fact}".

Some additional notes that might be helpful:

The value in the return statement represents the status of the function, not any data it may have produced. In the absence of a return statement, the exit status of the last command executed in the function is passed back to the caller.

The return status is truncated to 8 bits, and is unsigned, so it can only take the range 0-255.

In addition, the status of external commands has further conventions. Processes terminated by a signal get a status of 128 + the signal number. If the shell fails to create a new process, or to execute the command, 126 or 127 may be returned. Status 0 is conventionally success, and any small integer from 1 up indicates a command-detected error or unusual result. I would consider it wise to follow the same conventions in my shell functions, and never to return a data value this way.

Shell arithmetic is (according to the GNU/bash manual) evaluated in fixed-width integers. On my system, that appears to be 64-bit signed integers, but it may vary across systems and distros. 31 bits is only sufficient to hold 12!, and 63 bits only holds 20!, which may limit your scope.

This fragment shows Bash arithmetic overflowing 63 bits, somewhere around 9.22e+18.

Paul--) for k in {1..10}; do
> printf '%s %sn' $k $(( 3000000000000000000 * k ))
> done
1 3000000000000000000
2 6000000000000000000
3 9000000000000000000
4 -6446744073709551616
5 -3446744073709551616
6 -446744073709551616
7 2553255926290448384
8 5553255926290448384
9 8553255926290448384
10 -6893488147419103232
Paul--) 

My go-to for large numbers is the dc command, which does unconstrained numeric size, but requires RPN (reverse polish notation). This fragment generates the RPN commands to list factorials up to 10!

Paul--) { echo 1; seq -s ' p * p ' 2 10; echo ' p * p q'; }
1
2 p * p 3 p * p 4 p * p 5 p * p 6 p * p 7 p * p 8 p * p 9 p * p 10
 p * p q
Paul--) 

and this is the execution (but I tested up to 400!):

Paul--) { echo 1; seq -s ' p * p ' 2 10; echo ' p * p q'; } | dc
2
2
3
6
4
24
5
120
6
720
7
5040
8
40320
9
362880
10
3628800
Paul--) 

I’m writing a script in bash and I get this error:

./P4.1: line 10: +: syntax error: operand expected (error token is "+")

And this is my code:

#!/bin/bash
read string
echo $string >| temp
num1= cut -d" " -f1 temp
num2= cut -d" " -f2 temp
num3= cut -d" " -f3 temp
while [ $num1 -gt $num3 ]
do
        echo $num1
        num1=$[$num1+$num2]
done

What’s wrong and how do I fix it?
Thanks.

asked Nov 24, 2013 at 16:03

shoham's user avatar

1

Combination of ceving and Tomek’s:

#!/bin/bash
read num1 num2 num3
while [ $num1 -lt $num3 ]
do
    echo $num1
    num1=$((num1+num2))
done

answered Nov 24, 2013 at 16:32

Blue Ice's user avatar

Blue IceBlue Ice

7,8186 gold badges31 silver badges51 bronze badges

4

Use round parenthesis for numeric computations:

num1=$((num1 + num2))

BoltClock's user avatar

BoltClock

687k158 gold badges1373 silver badges1349 bronze badges

answered Nov 24, 2013 at 16:10

ceving's user avatar

cevingceving

21.1k11 gold badges97 silver badges168 bronze badges

0

#!/bin/bash
read string
echo "${string}" >| temp
num1= cut -d" " -f1 temp
num2= cut -d" " -f2 temp
num3= cut -d" " -f3 temp
while [ "${num1}" -gt "${num3}" ]
do
    echo "${num1}"
    num1=$(expr "${num1}" + 1)
done

also, quote and brace your variables. :D

answered Nov 24, 2013 at 16:09

petrus4's user avatar

petrus4petrus4

6164 silver badges7 bronze badges

0

try
num1=$[ num1 + num2 ]
may remove the error ~

answered Jun 30, 2022 at 1:49

Maplefrost's user avatar

I am getting this error bellow:

Path to the shell file:line 6: ++++: syntax error: operand expected (error token is "+")

and

Path to the shell file:line 13: ((: i <= : syntax error: operand expected (error token is "<= ")

This is my script:

#!/bin/bash  
SCRIPTPATH=$( cd $(dirname $0) ; pwd -P )
file="$SCRIPTPATH/android/sdcard.img"
file2="$SCRIPTPATH/android/devices.txt"

TOTALDEVICES=$(($1+$2+$3+$4+$5))
ANDROID4=0
ANDROID5=0
ANDROID5_1=0
ANDROID6=0
ANDROID7=0
echo $TOTALDEVICES
for ((i = 1; i <= $TOTALDEVICES; i++));

do
   if (($1 > 0 && $ANDROID4 < $1)) 
   then 
   echo "Device$i PACKAGE(avd4.4) 1"
   ANDROID4=$((ANDROID4 + 1))
    echo "no" |~/Android/Sdk/tools/bin/avdmanager create avd -f --package 'system-images;android-19;google_apis;armeabi-v7a' --name "avd4"  --tag 'google_apis' -p $SCRIPTPATH/android/avd4
   fi

   if (($2 > 0 && $ANDROID5 < $2 && $ANDROID4 == $1 && $i > $ANDROID4))
   then 
   echo "Device$i PACKAGE(avd5.0) 2"
   ANDROID5=$((ANDROID5 + 1))
    echo "no" |~/Android/Sdk/tools/bin/avdmanager create avd -f --package 'system-images;android-21;google_apis;armeabi-v7a' --name "avd5"  --tag 'google_apis' -p $SCRIPTPATH/android/avd5
   fi
   if (($3 > 0 && $ANDROID5_1 < $3 && $ANDROID5 == $2 && $i > $ANDROID5 + $ANDROID4))
   then 
   echo "Device$i PACKAGE(avd5.1) 3"
   ANDROID5_1=$((ANDROID5_1 + 1))
    echo "no" |~/Android/Sdk/tools/bin/avdmanager create avd -f --package 'system-images;android-22;google_apis;x86' --name "avd5.1"  --tag 'google_apis' -p $SCRIPTPATH/android/avd5.1
   fi
   if (($4 > 0 && $ANDROID6 < $4 && $ANDROID5_1 == $3 && $i > $ANDROID5_1 + $ANDROID5 + $ANDROID4))
   then 
   echo "Device$i PACKAGE(avd6) 4"
   ANDROID6=$((ANDROID6 + 1))
   echo "no" | ~/Android/Sdk/tools/bin/avdmanager create avd -f --package 'system-images;android-23;google_apis;x86' --name "avd6"  --tag 'google_apis' -p $SCRIPTPATH/android/avd6
   fi
   if (($5 > 0 && $ANDROID7 < $5 && $ANDROID6 == $4 && $i > $ANDROID6 + $ANDROID5_1 + $ANDROID5 + $ANDROID4))
   then 
   echo "Device$i PACKAGE(avd7) 5"
   ANDROID7=$((ANDROID7 + 1))
   echo "no" | ~/Android/Sdk/tools/bin/avdmanager create avd -f --package 'system-images;android-24;google_apis;x86' --name "avd7"  --tag 'google_apis' -p $SCRIPTPATH/android/avd7  
   fi
done

AVDMANAGEROUTPUT=$(~/Android/Sdk/tools/bin/avdmanager list avds | grep "Name:")
AVDMANAGEROUTPUT=${AVDMANAGEROUTPUT//$'n'/} # Remove all newlines.
AVDMANAGEROUTPUT=${AVDMANAGEROUTPUT%$'n'}   # Remove a trailing newline.
DEVICES=()
i=0
IFS=' ' read -r -a array <<< "$AVDMANAGEROUTPUT"
for index in "${!array[@]}"
do
    rem=$(( $index % 2 )) #check for odd number to avoid Name:
    if [ $rem -eq 1 ]
    then
        echo "${array[index]}" #Now put values into an array
        DEVICES[$i]=`echo @"${array[index]}"`
        i=$((i+1))
    fi
done
# Check if the sdcard is available
if [ -f "$file" ]
then
    echo "$file found."
    ~/Android/Sdk/emulator/emulator ${DEVICES[0]} -sdcard $file >> "$SCRIPTPATH/emulators.txt" 2>&1 & #open the emulator
    ~/Android/Sdk/emulator/emulator ${DEVICES[1]} -sdcard $file >> "$SCRIPTPATH/emulators.txt" 2>&1 & #open the emulator
    ~/Android/Sdk/emulator/emulator ${DEVICES[2]} -sdcard $file >> "$SCRIPTPATH/emulators.txt" 2>&1 & #open the emulator
    ~/Android/Sdk/emulator/emulator ${DEVICES[3]} -sdcard $file >> "$SCRIPTPATH/emulators.txt" 2>&1 & #open the emulator
    ~/Android/Sdk/emulator/emulator ${DEVICES[4]} -sdcard $file >> "$SCRIPTPATH/emulators.txt" 2>&1 & #open the emulator
    sleep 110
else
# if there is none,here we are creating one
    echo "$file not found."
    ~/Android/Sdk/emulator/mksdcard 10G "$SCRIPTPATH/android/sdcard.img"
    sleep 5
    ~/Android/Sdk/emulator/emulator ${DEVICES[0]} -sdcard $file  >> "$SCRIPTPATH/emulators.txt" 2>&1 &  
    ~/Android/Sdk/emulator/emulator ${DEVICES[1]} -sdcard $file >> "$SCRIPTPATH/emulators.txt" 2>&1 & #open the emulator
    ~/Android/Sdk/emulator/emulator ${DEVICES[2]} -sdcard $file >> "$SCRIPTPATH/emulators.txt" 2>&1 & #open the emulator
    ~/Android/Sdk/emulator/emulator ${DEVICES[3]} -sdcard $file >> "$SCRIPTPATH/emulators.txt" 2>&1 & #open the emulator
    ~/Android/Sdk/emulator/emulator ${DEVICES[4]} -sdcard $file >> "$SCRIPTPATH/emulators.txt" 2>&1 & #open the emulator
    sleep 110
fi

Zanna's user avatar

Zanna

68.2k55 gold badges210 silver badges320 bronze badges

asked May 4, 2017 at 6:41

Sibabalwe Mvelo's user avatar

1

Line 6 of your script expects arguments 1 to 5 to exist. If you run your script with no arguments $1+$2+$3+$4+$5 will become +++++ which explains the error message. (A similar explanation is valid for the second error message.) Perhaps you should check that 5 arguments have been provided and exit with an error message if this test fails, e. g.:

if [ $# != 5 ]
then
    echo "Usage: scriptname num1 num2 num3 num4 num5"
    exit 2
fi

Alternatively you can provide a default value for missing arguments with Bash’s parameter expansion. In the following expression the first 5 command-line arguments, or 0 in their absence, are added to a sum:

$((${1-0} + ${2-0} + ${3-0} + ${4-0} + ${5-0}))

Note that you should also check that each of the 5 arguments is numeric before attempting to obtain their sum.

David Foerster's user avatar

answered May 4, 2017 at 9:00

Jeffrey Ross's user avatar

Thank you for your answer, you helped me see what I did wrong.

How did I fix it:

I then ran the sh file like ‘file.sh’ 1 1 1 1 1 which had enabled the emulators to run. The 1s determine how many emulators of each do I want to run.

answered May 9, 2017 at 13:51

Sibabalwe Mvelo's user avatar

0

In this script for monitoring the real-time network port rate, there is an error on lines 21 and 22:

#!/bin/bash
#Modified by [email protected]
echo ===DTmobile NetSpeedMonitor===
sleep 1
echo loading...
sleep 1

ethn=$1
 
while true
do
  RXpre=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{print $2}')
  TXpre=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{print $10}')
  sleep 1
  RXnext=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{print $2}')
  TXnext=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{print $10}')
 
  clear
  echo -e "ttt  RX tt   TX  ttt TIME"
 
  RX=$((${RXnext}-${RXpre}))
  TX=$((${TXnext}-${TXpre}))
 
  if [ $RX -lt 1024 ];then
    RX="${RX}B/s"
  elif [ $RX -gt 1048576 ];then
    RX=$(echo $RX | awk '{print $1/1048576 "MB/s"}')
  else
    RX=$(echo $RX | awk '{print $1/1024 "KB/s"}')
  fi
 
  if [ $TX -lt 1024 ];then
    TX="${TX}B/s"
  elif [[ $TX -gt 1048576 ]];then
    TX=$(echo $TX | awk '{print $1/1048576 "MB/s"}')
  else
    TX=$(echo $TX | awk '{print $1/1024 "KB/s"}')
  fi
 
  echo -e "$ethn t $RX   $TX   ttt `date +%k:%M:%S` "
 
done

Revised document

#!/bin/bash
#Modified by [email protected]
echo ===DTmobile NetSpeedMonitor===
sleep 1
echo loading...
sleep 1

ethn=$1
 
while true
do
  RXpre=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{print $2}')
  TXpre=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{print $10}')
  sleep 1
  RXnext=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{print $2}')
  TXnext=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{print $10}')
 
  clear
  echo -e "ttt  RX tt   TX  ttt TIME"
 
  RX=$((RXnext-RXpre))
  TX=$((TXnext-TXpre))
 
  if [ $RX -lt 1024 ];then
    RX="${RX}B/s"
  elif [ $RX -gt 1048576 ];then
    RX=$(echo $RX | awk '{print $1/1048576 "MB/s"}')
  else
    RX=$(echo $RX | awk '{print $1/1024 "KB/s"}')
  fi
 
  if [ $TX -lt 1024 ];then
    TX="${TX}B/s"
  elif [[ $TX -gt 1048576 ]];then
    TX=$(echo $TX | awk '{print $1/1048576 "MB/s"}')
  else
    TX=$(echo $TX | awk '{print $1/1024 "KB/s"}')
  fi
 
  echo -e "$ethn t $RX   $TX   ttt `date +%k:%M:%S` "
 
done

The reason is that when the value of $is taken, only variables need to be followed in the brackets (variables can be calculated by themselves), and it is not necessary to take the value of variables in the brackets

RX=$((${RXnext}-${RXpre}))
  TX=$((${TXnext}-${TXpre}))
  
change to:
  
  RX=$((RXnext-RXpre))
  TX=$((TXnext-TXpre))

And then there’s no error~~~

Similar Posts:

10 More Discussions You Might Find Interesting

1. Homework & Coursework Questions

Compiler error «lvalue required as left operand of assignment»

1. After trying to compile code error is given Lvalue required as left operand of assignment.

2. Relevant commands, code, scripts, algorithms:
if , else if

3. The attempts at a solution (include all code and scripts):
/*
File: incircles.cpp
Created by: James Selhorst
(2 Replies)

Discussion started by: c++newb

2. Shell Programming and Scripting

Syntax error near unexpected token `»Hit <ENTER> to continue:»‘

the below code will search attr string inside makefile under the modelno on given path.

echo «Enter model no for searching string inside makefile»
read inputs2
#find /pools/home_unix/sapte/work/models/model/$inputs2 -name «makefile» | xargs grep «attr» ;
#;;I am getting below error…. (7 Replies)

Discussion started by: lathigara

3. UNIX for Dummies Questions & Answers

redirect for «[: : integer expression expected» error

Hi, I read in this forum that for «https://www.unix.com/shell-programming-scripting/156008-integer-expression-expected-regular-expression.html

thanks! (7 Replies)

Discussion started by: Vijay81

4. Programming

«lvalue required as left operand of assignment» error in C

Hey all. I’ve been working on some fun with C and decided to write a Rock Paper Scissors game. The problem is, that when I try to compile the file, it gives «lvalue required as left operand of assignment» error. The error line is here:

for ((point1=0 && point2=0); ((point1=3) || (point2=3));… (4 Replies)

Discussion started by: drouzzin

5. UNIX for Dummies Questions & Answers

> 5 «)syntax error: operand expected (error token is » error

im kinda new to shell scripting so i need some help

i try to run this script and get the error code
> 5 «)syntax error: operand expected (error token is »

the code for the script is

#!/bin/sh
#
# script to see if the given value is correct
#
# Define errors
ER_AF=86 # Var is… (4 Replies)

Discussion started by: metal005

6. Fedora

«integer expression expected» error with drive space monitoring script

Hi guys,

I am still kinda new to Linux.

Script template I found on the net and adapted for our environment:

#!/bin/sh
#set -x
ADMIN=»admin@mydomain.com»
ALERT=10
df -H | grep -vE ‘^Filesystem|tmpfs|cdrom’ | awk ‘{ print $5 » » $1 }’ | while read output;
do
#echo $output
(2 Replies)

Discussion started by: wbdevilliers

7. Shell Programming and Scripting

error «test: [-d: unary operator expected» very confused.

Im trying to check if a series of directory exists and if not create them, and am having issues. All the instances of test return with the error «test:
#!/bin/bash
location_Parent=~/Documents/sight_of_sound
location_IMG=~/Documents/Sight_of_sound/IMG
location_AUD=~/Documents/Sight_of_sound/AUD… (4 Replies)

Discussion started by: orionrush

8. Shell Programming and Scripting

error «integer expression expected» when selecting values

dear members,

I am having some difficulties with an automation script that I am writing.

We have equipments deployed over our network that generate status messages and I was trying an automated method to collect all information.

I did a expect script that telnet all devices, logs, asks for… (4 Replies)

Discussion started by: jorlando

9. UNIX for Dummies Questions & Answers

«test: argument expected» error

Hi,
No need to say I’m new to unix shell scripting.
I have a very simple script that goes this way:

for datos in `ls -rt $UNXLOG/26-Jan*`
do
export arch=`echo $datos |cut -d, -f1`
if
then
export linea1=`grep Debut ${arch}`
export horatot=`echo $linea1 |cut -d’ ‘ -f5`
(7 Replies)

Discussion started by: mvalonso

10. Solaris

«syntax error near unexpected token `fi’ «

one of my script as follows

HOME=/apps/logs
mv $HOME/cron.log $HOME/cron.log.`date +%Y-%m-%d`
touch $HOME/cron.log
fi

i am getting error as follows

on the last line we are getting …

«syntax error near unexpected token `fi’ »

please suggest…. (4 Replies)

Discussion started by: GIC1986

Понравилась статья? Поделить с друзьями:
  • Bash syntax error in expression error token is
  • Bash syntax error in conditional expression
  • Bash suppress error
  • Bash sudo command not found как исправить
  • Bash sh syntax error unexpected end of file