Semplice matematica dichiarazioni in bash in un ciclo for

Sono abbastanza nuovo di scripting bash e di solito evitare a tutti i costi, ma ho bisogno di scrivere uno script bash per eseguire alcune semplici cose su un cluster remoto. Sto avendo problemi con un ciclo for che esegue le seguenti operazioni:

for i in {1..20}
do
    for j in {1..20}
    do
        echo (i*i + j*j ) **.5  <--- Pseudo code!
    done
done

Mi potete aiutare con questo semplice matematica? Io ho buttato $‘s ovunque e non può scrivere correttamente. Se si mi potrebbe aiutare a capire come le variabili sono chiamate/ricevuto in bash per i loop e le limitazioni di bash matematica interpretazione (come si fa a fare la radice quadrata?) Sarei molto grato. Grazie!

InformationsquelleAutor physicsmichael | 2009-12-04

11 risposte

  1. 8

    Ecco una soluzione decente:

    for i in {1..20}
    do
       for j in {1..20}
       do
           echo "scale = 3; sqrt($i*$i + $j*$j)" | bc
       done
    done

    Output sarà:

    1.414
    2.236
    3.162
    2.236
    [...etc...]

    InformationsquelleAutor dustmachine

  2. 11

    Espansione aritmetica bisogni $((...)) notazione, quindi qualcosa di simile:

    echo $((i*i + j*j))

    Tuttavia, bash usa solo numeri interi, quindi potrebbe essere necessario utilizzare uno strumento esterno come dc.

    E. g.

    dc -e "18k $i $i * $j $j * + v p"

    InformationsquelleAutor CB Bailey

  3. 2

    Shell matematica può essere fatto in diversi modi.

    echo $(( i*i + j*j ))
    echo $[ i*i + j*j ]
    expr "$i" '*' "$i" '+' "$j" '*' "$j"

    Tuttavia, questo può solo gestire l’intero aritmetica. Invece, è possibile utilizzare bc:

    echo "scale = 5; sqrt( $i*$i + $j*$j)" | bc

    Cambiare scale per il numero di posizioni decimali desiderato.

    Io sono sempre molto numerosi (standard_in) 1: errore di analisi
    Probabilmente ti manca il .. tra il 1 e il 20 in {1..20} gamma
    Strano, dovrebbe funzionare in qualsiasi POSIX bc. Cosa succede se si utilizza dc? cioè dc -e "5 k $i $i * $j $j * + v p"
    Bah. Ho cortocircuitato il j loop in modo che non avrebbe inondano lo schermo e ha introdotto un errore di battitura.

    InformationsquelleAutor ephemient

  4. 2
    #!/bin/bash
    for i in {1..20}; do
        for j in {1..20}; do
            echo 5k$i $i\* $j $j\*+vp | dc
        done
    done
    La mia variante: printf "%s %s 10kd*rd*+vp" "$i" "$j" | dc

    InformationsquelleAutor DigitalRoss

  5. 1

    fa il cluster remoto solo bash? se non, provare e vedere se si dispone di awk

    awk 'BEGIN{
      for(i=1;i<=20;i++){
        for(j=1;j<=20;j++){
           print ( i*i + j*j ) ** 0.5
        }
      }
    }'

    InformationsquelleAutor ghostdog74

  6. 0

    Usare le doppie parentesi di valutare una variabile.

    variableA=$((variableB*variableC))

    Solo per int.

    InformationsquelleAutor rerun

  7. 0

    Il codice

    echo $[(($i * $i) + ($j * $j)) ** $X]

    funzionerà se $X è un numero intero. Si sta cercando di prendere la radice quadrata, e io non sono sicuro se bash built-in aritmetica? Probabilmente è meglio usare il più potente strumento calcolatrice (come bc, et al.) per questo.

    InformationsquelleAutor bta

  8. 0

    Bash non offre funzioni matematiche. Tuttavia, è quasi certamente la korn shell installato. Questo dovrebbe funzionare:

    #!/bin/ksh
    
    for i in {1..20}
    do
        for j in {1..20}
        do
            x=$((sqrt(i*i + j*j)))
            echo "sqrt($i^2 + $j^2) = $x"
        done
    done

    L’inizio della produzione è

    sqrt(1^2 + 1^2) = 1.41421356237309505
    sqrt(1^2 + 2^2) = 2.2360679774997897
    sqrt(1^2 + 3^2) = 3.16227766016837933
    sqrt(1^2 + 4^2) = 4.12310562561766055
    sqrt(1^2 + 5^2) = 5.09901951359278483
    sqrt(1^2 + 6^2) = 6.08276253029821969
    sqrt(1^2 + 7^2) = 7.07106781186547524
    sqrt(1^2 + 8^2) = 8.06225774829854965
    sqrt(1^2 + 9^2) = 9.05538513813741663
    sqrt(1^2 + 10^2) = 10.0498756211208903
    “quasi certamente”? Certamente non standard su qualsiasi distribuzione Linux ho visto. Forse vuoi dire che *BSD?
    Mac OSX 10.6.
    OSX è BSD-like.
    ksh è su Fedora e CentOS.
    È disponibile come pacchetto, ma non parte l’installazione predefinita. La maggior parte dei sistemi Linux utilizza Bash come shell di default; Bsd tendono a gravitare intorno a vari non-GNU conchiglie.

    InformationsquelleAutor wallyk

  9. -1

    Un’altra forma di numero intero di espressioni matematiche in Bash mette la doppia parentesi sull’esterno della intera espressione per le operazioni di assegnazione:

    (( var = i ** 2 ))
    (( i++ ))
    (( position += delta ))

    Come si può vedere, il segno del dollaro non è necessario (né all’interno $(())). Inoltre, gli spazi sono consentiti il segno di uguale.

    Inoltre, questo modulo può essere utilizzato in condizionali:

    sixpacks=8             # note spaces not allowed here
    (( beerprice = 8 ))    # but you can use spaces this way
    budget=50
    
    # you can do assignments inside a conditional just like C
    until (( (( beertotal = sixpacks * beerprice )) <= budget ))
    do
        (( sixpacks-- ))
    done
    echo "Buy ${sixpacks} six-packs at \$${beerprice} each for a total of \$${beertotal}."

    O si può sostituire tutti che con questo, naturalmente:

    beerprice=8
    budget=50
    
    # integer division
    (( sixpacks = budget / beerprice ))
    (( beertotal = sixpacks * beerprice ))
    echo "Buy ${sixpacks} six-packs at \$${beerprice} each for a total of \$${beertotal}."

    Bash ha anche un let istruzione:

    let a=2**16
    let 'a>>=1'    # bitwise shift - some operations need to be quoted or escaped
    (( a>>=1 ))    # but not inside (())

    InformationsquelleAutor Dennis Williamson

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *