2016-03-24 26 views
0

Der Quellcode ist:ganzzahliger Ausdruck erwartet - shell scripting

#!/bin/bash 

read nr 

if [ $nr -le 2 ] 
then 
     echo " $nr is not prime" 
else 
     d=2 
     while [ $d -le `expr $nr/2 ` ] && [ `expr $d % $nr ` -ne 0 ] 
     do 
       d=$((d+1)) 
     done 
     if [ $d -le `expr $nr/2 ` ] 
     then 
       echo " $nr is not prime" 
     else 
       echo " $nr is prime" 
     fi 
fi 

Wenn zum Beispiel der "nr" Variable den Wert 6 hat, I den Fehler:

./prim.sh: line 14: [: 6/2: integer expression expected 
+0

Wenn Sie '$ ((...))' 'verwenden, sollten Sie' expr' nicht verwenden. 'expr' ist relativ ungeschickt. Es ist auch besser, '$ (...)' als Back-Ticks im Allgemeinen zu verwenden. Sie könnten auch auf dem '[[' Built-In - ich mag es nicht lesen, aber ich bin komisch und alt (und es verletzt meine antiken Empfindlichkeiten über die Konsistenz der Notation). –

Antwort

0
[ 2 -le 6/2 ] && echo yes 

wird funktioniert nicht, aber

[ 2 -le $((6/2)) ] && echo yes 

sollte.

+0

Ich habe geändert und es hat funktioniert, danke! – Achi

0
# the source of problem is that `expr $nr/2 ` is different of `expr $nr/2 ` (with space arround the "/" caracter): 
# if nr=6 
# `expr $nr/2 ` is a string "6/2" 
# `expr $nr/2 ` is 3 

nr=6 
echo `expr $nr/2 ` 
#6/2 

echo `expr $nr/2 ` 
#3 

if [ $d -le `expr $nr/2 ` ] 
# will compare an integer with a string 

# contrariwise, the following statement is ok : 
if [ $d -le `expr $nr/2` ] 

es ein weiteres Problem über die Modulo ist: (nr% $ d $) und nicht (d% $ nr $)

Korrektur:

#!/bin/bash 

read nr 

if [ $nr -le 2 ] 
then 
     echo "$nr is prime" 
else 
     d=2 
     while [ $d -le `expr $nr/2 ` ] && [ `expr $nr % $d ` -ne 0 ] 
     do 
       d=$((d+1)) 
     done 
     if [ $d -le `expr $nr/2` ] 
     then 
       echo "$nr is not prime" 
     else 
       echo "$nr is prime" 
     fi 
fi 
done 

prüfen

for nr in {1..12}; do 
d=2 
if [ $nr -le 2 ] 
then 
     echo "$nr is prime" 
else 
     d=2 
     while [ $d -le `expr $nr/2 ` ] && [ `expr $nr % $d ` -ne 0 ] 
     do 
       d=$((d+1)) 
     done 
     if [ $d -le `expr $nr/2` ] 
     then 
       echo "$nr is not prime" 
     else 
       echo "$nr is prime" 
     fi 
fi 
done 

#1 is prime 
#2 is prime 
#3 is prime 
#4 is not prime 
#5 is prime 
#6 is not prime 
#7 is prime 
#8 is not prime 
#9 is not prime 
#10 is not prime 
#11 is prime 
#12 is not prime