2016-07-19 11 views
-3
#!/bin/bash 


if [ $2 == "+" ]; then 
    echo $1 + $3 | bc 
elif [ $2 == "-" ]; then 
echo $1 -$3 | bc 
elif [ $2 == "/" ]; then 
echo $1/$3 | bc -l 
elif [ ${2: -0} == "\*" ]; then 
    echo $1 \* $3 | bc 
fi 





[[email protected] Desktop]$ ./q1.sh 5 \* 2 
./q1.sh: line 4: [: too many arguments 
./q1.sh: line 6: [: too many arguments 
./q1.sh: line 8: [: too many arguments 
./q1.sh: line 10: [: too many arguments 
+0

Nur ein Gedanke .. Platz eine Verknüpfung für den Test Befehl Klammern - also einige Sonderzeichen innerhalb einer Variable selbst kann die Zeichenfolge in „multiple brechen Argumente "... – Zak

+0

Bitte lesen Sie http://stackoverflow.com/help/how-to-ask. Es wird Ihnen helfen, Ihre Frage so zu formulieren, dass wir Ihnen helfen können. – jbrown

Antwort

0

Below Skript tun würde:

#!/bin/bash 
    if [ "$2" = "+" ] # == won't work with old test ie [], 
    #use [[ ]] if you wish to use == 
    then 
    echo "$1 + $3" | bc 
    elif [ "$2" = "-" ]; then 
    echo "$1 - $3" | bc 
    elif [ "$2" = "/" ]; then 
     if [ "$3" -ne 0 ] 
     then 
     echo "scale=3;$1/$3" | bc -l # scale gives the precision of the results 
     else 
     echo "Division by zero not possible" 
     fi 
    elif [ "$2" = '*' ]; then 
     # You need to escape or quote the asterisk in the command line 
     # when calling the script like ./script 3 \* 4 
     echo "$1 * $3" | bc 
    fi 2>/dev/null # For suppressing the errors when using '\*' as $2 

Sample Run

$ ./38464438.sh 4 + 5 
9 
$ ./38464438.sh 4 - 5 
-1 
$ ./38464438.sh 4/5 
.800 
$ ./38464438.sh 4 \* 5 
20 
+0

Zum Downvoter habe ich vergessen, einige Variablen zu zitieren, die ich korrigiert habe. Ist das der einzige Grund für einen Downvote? – sjsam

0

immer Zitat Ihre Erweiterungen Parameter, wenn Sie einen sehr guten Grund, nicht zu. Wenn $2* ist (wie in Ihrem Beispiel), erfährt es eine Pfadnamenerweiterung. * wird auf jede Datei im aktuellen Arbeitsverzeichnis erweitert, wodurch viel zu viele Argumente für den Befehl erzeugt werden.

if [ "$2" = "+" ]; then 

(Verwenden Sie auch nicht == mit [, verwenden Sie den richtigen Gleichheitsoperator =.)


Bonus Tipp: Das Skript erhält * als Argument, nicht \*, so Ihre endgültige Vergleich sollte

elif [ "$2" = "*" ]; then 
1
#!/bin/bash 
bc <<< "[email protected]" 
Beispiele

:

q1 5 \* 2 
q1 'scale=5; sqrt(9^2 + 10^2 + 33^2)' 

Ausgang:

10 
35.63705