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
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 IceBlue Ice
7,8186 gold badges31 silver badges51 bronze badges
4
Use round parenthesis for numeric computations:
num1=$((num1 + num2))
BoltClock
686k158 gold badges1372 silver badges1347 bronze badges
answered Nov 24, 2013 at 16:10
![]()
cevingceving
21.1k11 gold badges97 silver badges166 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. 😀
answered Nov 24, 2013 at 16:09
petrus4petrus4
6164 silver badges7 bronze badges
0
try
num1=$[ num1 + num2 ]
may remove the error ~
answered Jun 30, 2022 at 1:49
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 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♦
68.1k55 gold badges209 silver badges319 bronze badges
asked May 4, 2017 at 6:41
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.
![]()
answered May 4, 2017 at 9:00
![]()
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
0
У меня есть два массива, которые я хочу зациклить. Я создаю их правильно, и перед тем, как перейти к циклу for, я повторяю их, чтобы убедиться, что с массивами все в порядке. Но при запуске скрипта выдает ошибку:
l<=: syntax error: operand expected (error token is "<="
Я проконсультировался с могущественным Google и понял, что он страдает от отсутствия второй переменной, но я упоминал ранее, что я повторяю значения, и все вроде бы в порядке. Вот фрагмент..
#!/bin/bash
k=0
#this loop is just for being sure array is loaded
while [[ $k -le ${#hitEnd[@]} ]]
do
echo "hitEnd is: ${hitEnd[k]} and hitStart is: ${hitStart[k]}"
# here outputs the values correct
k=$((k+1))
done
k=0
for ((l=${hitStart[k]};l<=${hitEnd[k]};l++)) ; do //this is error line..
let array[l]++
k=$((k+1))
done
Переменные в цикле for отображаются правильно, но цикл for не работает… где я ошибаюсь?
#
как ответил gniourf_gniourf:
«… В какой-то момент k достигнет значения ${#hitEnd[@]}, и это как раз тогда, когда hitEnd[k] не определен и расширяется до пустой строки! Взрыв!»
это означает, что вывод ошибки отображается не в начале цикла, а когда k имеет большее значение, чем индексы массива, указывая индекс, который массив не включает…
I had a script that was doing well until now, I don’t now what has changed, but the script is the same.
I had this variables:
SIZEKB=$[[(SIZE+1023)/1024]]
REQUIREDKB=$[[SIZEKB+MINFREEKB]]
Which I repeat were working ok, but now I got this error:
line 12: [(SIZE+1023)/1024]: syntax error: operand expected (error token is "[(SIZE+1023)/1024]")
line 13: [SIZEKB+MINFREEKB]: syntax error: operand expected (error token is "[SIZEKB+MINFREEKB]")
What should I change to correct the syntax, thanks!
asked Dec 17, 2020 at 10:43
Andrés ChandíaAndrés Chandía
9771 gold badge16 silver badges32 bronze badges
7
The easiest way to write those assignment is to providean arithmetic context:
((SIZEKB=(SIZE+1023)/1024))
((REQUIREDKB=SIZEKB+MINFREEKB))
You can use also
SIZEKB=$[(SIZE+1023)/1024]
REQUIREDKB=$[SIZEKB+MINFREEKB]
but this is deprecated and provided for compatibility with old scripts (perhaps those written for bash version 1?).
answered Dec 17, 2020 at 11:27
You need to place the equations in two curly brackets and so:
REQUIREDKB=$(( $SIZEKB+$MINFREEKB ))
Alternatively, you can use single square brackets and so:
REQUIREDKB=$[ $SIZEKB+$MINFREEKB ]
![]()
answered Dec 17, 2020 at 10:56
![]()
Raman SailopalRaman Sailopal
12.1k2 gold badges8 silver badges17 bronze badges
I had a script that was doing well until now, I don’t now what has changed, but the script is the same.
I had this variables:
SIZEKB=$[[(SIZE+1023)/1024]]
REQUIREDKB=$[[SIZEKB+MINFREEKB]]
Which I repeat were working ok, but now I got this error:
line 12: [(SIZE+1023)/1024]: syntax error: operand expected (error token is "[(SIZE+1023)/1024]")
line 13: [SIZEKB+MINFREEKB]: syntax error: operand expected (error token is "[SIZEKB+MINFREEKB]")
What should I change to correct the syntax, thanks!
asked Dec 17, 2020 at 10:43
Andrés ChandíaAndrés Chandía
9771 gold badge16 silver badges32 bronze badges
7
The easiest way to write those assignment is to providean arithmetic context:
((SIZEKB=(SIZE+1023)/1024))
((REQUIREDKB=SIZEKB+MINFREEKB))
You can use also
SIZEKB=$[(SIZE+1023)/1024]
REQUIREDKB=$[SIZEKB+MINFREEKB]
but this is deprecated and provided for compatibility with old scripts (perhaps those written for bash version 1?).
answered Dec 17, 2020 at 11:27
You need to place the equations in two curly brackets and so:
REQUIREDKB=$(( $SIZEKB+$MINFREEKB ))
Alternatively, you can use single square brackets and so:
REQUIREDKB=$[ $SIZEKB+$MINFREEKB ]
![]()
answered Dec 17, 2020 at 10:56
![]()
Raman SailopalRaman Sailopal
12.1k2 gold badges8 silver badges17 bronze badges