Basteln eines Shell Scripts!

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von wanted, 19.11.2008.

  1. wanted

    wanted Jungspund

    Dabei seit:
    16.11.2008
    Beiträge:
    16
    Zustimmungen:
    0
    Hallo Leute,

    Ich bins mal wieder ;) Der Anfänger :D
    Also ich lebe mich schön langsam richtig ein was Shell betrifft und macht Spaß damit zu arbeiten!

    Jetzt würde ich gerne etwas testen, weiß aber leider nicht genau wie das funktioniert! :( Hoffentlich könnt ihr mir weiterhelfen bzw. einen Denkanstoß geben!

    Ich möchte ein Shell Script schreiben (abc.sh)! Dieses Shell Script soll ein Textfile erstellen (text.txt) und den Inhalt der Datei /etc/neu in das Textfile kopieren!

    So anschließend sollen alle Zeilen von text.txt ausgegeben werden, deren Zeilennummer eine Primzahl ist! (Es soll zuerst die Zeilennummer und
    dann der Inhalt der Zeile ausgegeben werden)

    Hört sich eigentlich super an, jedoch reichen meine Kenntnisse einfach noch nicht ganz aus!

    Ich hätte es einmal so angefangen:

    1) vi abc.sh
    Das wäre einmal meine abc.sh! Hab ich da schon einen Fehler?

    Doch wie löse ich das dann mit den Primzahlen? Das würde ich scheitern wenn ich nicht schon oben gescheitert bin :D

    Hoffe mir kann jemand weiterhelfen!
    Danke vielmals!

    Lg
    wanted
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. Dvergr

    Dvergr Tripel-As

    Dabei seit:
    10.10.2006
    Beiträge:
    180
    Zustimmungen:
    0
    Code:
    #!/bin/sh
    cat /etc/neu > text.txt
    
    Das reicht bereits aus, das File muss nicht erst erstellt werden.
     
  4. #3 supersucker, 19.11.2008
    supersucker

    supersucker Foren Gott

    Dabei seit:
    21.02.2005
    Beiträge:
    3.873
    Zustimmungen:
    0
    Na dann kriegst du doch mal ein paar Denkanstöße:

    - Zeilenweise Datei einlesen:

    Code:
    while read....
    (Rest siehe google)

    - Zeilennummer rauskriegen: Lass einfach einen counter bei "while read" mitlaufen.

    - Primzahlen: Eigentlich recht einfach, du musst ja nur den counter auf Teilbarkeit prüfen.
    bc ist dein Freund, also dringend mal lesen:

    Code:
    man bc
     
  5. #4 beomuex, 19.11.2008
    beomuex

    beomuex Routinier

    Dabei seit:
    11.03.2007
    Beiträge:
    354
    Zustimmungen:
    0
    Mit factor gehts aber einfacher....
    Keine Primzahl wenn der zweite Faktor existiert....
    Code:
    $ factor 100
    100: 2 2 5 5
    
    Primzahl wenn der zweite Faktor leer ist....
    Code:
    $ factor 17
    17: 17
    
     
  6. #5 supersucker, 19.11.2008
    supersucker

    supersucker Foren Gott

    Dabei seit:
    21.02.2005
    Beiträge:
    3.873
    Zustimmungen:
    0
    Ah, nice one!

    factor kannte ich noch gar nicht.....:)
     
  7. #6 beomuex, 19.11.2008
    Zuletzt bearbeitet: 19.11.2008
    beomuex

    beomuex Routinier

    Dabei seit:
    11.03.2007
    Beiträge:
    354
    Zustimmungen:
    0
    Sample Code:
    auszurufen mit ./script.sh namederdatei namederzweitendatei
    Code:
    #!/bin/bash
    
    FILE1=$1
    FILE2=$2
    LINR=1
    #
    function testprime {
    #1 und 0 sind keine Primzahlen!
    
    if [[ $1 -eq 1 || $1 -eq 0 ]]
    then
            return 1
    fi
    #Array
    FAK=( $(factor $1) )
    #Wenn leer dann....
    if [ -z "${FAK[2]}" ]
    then
            #Es ist eine Primzahl
            return 0
    else
            #Keine Primzahl
            return 1
    fi
    }
    
    cp $FILE1 $FILE2
    echo "Total lines: `wc -l $FILE2`"
    sleep 2
    while read LINE
    do
    `testprime $LINR`
    if [ $?  -eq 0 ]
    then
            #echo "$LINR ist eine Primzahl"
            echo "$LINR : $LINE"
    #else
    
            #echo "$LINR ist keine Primzahl"
    fi
    LINR=`expr ${LINR} + 1`
    
    
    done < $FILE2
    
     
  8. wanted

    wanted Jungspund

    Dabei seit:
    16.11.2008
    Beiträge:
    16
    Zustimmungen:
    0
    Danke vielmals für eure Unterstützung! Echt spitze!

    @beomuex: Der Sample Code den du hier erstellt hast, ist das mein Beispiel im ersten Posting? Bzw. genau nach den Angaben die ich gegeben habe oder hat es auch was mit Primzahlen zu tun, und ist aber einfach nur ein frei gewähltes Beispiel? Wenn es ident zu meinem ist,was ich mir denke wenn ich mir den Code so ansehe, dann hätte ich einige Fragen dazu!

    Danke supersucker für deinen Lösungsvorschlag aber wenn der "factor" Vorschlag von beomuex einfacher ist, werde ich es mit diesem Versuchen!

    Also bitte gib mir bescheid!
    Danke, danke, danke ---> Ihr seit die Besten!

    Lg
    wanted
     
  9. #8 beomuex, 19.11.2008
    beomuex

    beomuex Routinier

    Dabei seit:
    11.03.2007
    Beiträge:
    354
    Zustimmungen:
    0
    Das ist ein on-demand Script :D

    Exakt nach deinen Vorgaben erstellt. :devil:

    Wenn du willst poste ich auch ne vollkommentierte Version....

    Gruß

    beomuex
     
  10. wanted

    wanted Jungspund

    Dabei seit:
    16.11.2008
    Beiträge:
    16
    Zustimmungen:
    0
    Das wäre super hilfreich von dir!
    Ansonsten würde ich eben meine 1000Fragen posten die sich aber vielleicht aufklären mit einer vollkommentierten Version!

    Wäre spitze!

    lg
     
  11. #10 beomuex, 19.11.2008
    Zuletzt bearbeitet: 19.11.2008
    beomuex

    beomuex Routinier

    Dabei seit:
    11.03.2007
    Beiträge:
    354
    Zustimmungen:
    0
    Kopier das am besten in nen Editor der Syntax-Highlighting hat (vi,emacs, kate, kwrite, geany, quanta etc)

    Code:
    
    #!/bin/bash                                        
    #Parameter 1 ist die org. Datei                    
    FILE1=$1
    #Parameter 2 ist die neue Datei
    FILE2=$2
    #Counter wird auf 1 gesetzt
    LINR=1
    #
    #Funktion, die prüft ob der Parameter mit dem sie aufgerufen wird eine Primzahl ist
    
    function testprime {
    
    #Wenn der Parameter ($1) 0 oder 1 ist würde die untere if Abfrage 0, sprich Primzahl ausgeben, da 0 und 1 aber per Definition keine Primzahlen sind,
    #gibt die folgende if Abfrage den return-Wert 1 (keine Primzahl zurück)
    if [[ $1 -eq 1 || $1 -eq 0 ]]
    then
            return 1
    fi
    #Wir definieren das Array FAK (für Faktor)
    FAK=( $(factor $1) )
    #Wenn die zweite Stelle des Arrays leer ist, dann ist es eine Primzahl, da es nur den 1. Teiler gibt
    # ==> -z == leer ; ${FAK[2]} == Wert der zweiten Stelle des Arrays FAK
    if [ -z "${FAK[2]}" ]
    then
            #Es ist eine Primzahl
            return 0
    else
            #Keine Primzahl
            return 1
    fi
    }
    #Kopieren des FILE1 nach FILE2
    cp $FILE1 $FILE2
    #Zählen aller Lines
    echo "Total lines: `wc -l $FILE2`"
    #Sonst sieht man nix ;-)
    sleep 2
    #Während wir von $FILE2 eine LINE bekommen(ganz am Schluss bei done < $FILE2), machen wir....
    while read LINE
    do
    #übergeben der aktuellen Liniennummer als Parameter an die Funktion testprime (siehe oben)
    `testprime $LINR`
    #Wenn der Rückgabewert gleich 0 ist dann
    if [ $?  -eq 0 ]
    then
            #"$LINR ist eine Primzahl"
            echo "$LINR : $LINE"
    #else
    #wenn nicht, sprich wenn der return wert 1 ist
            #"$LINR ist keine Primzahl"
    fi
    #Der Counter LINR wird um eins erhöht....
    LINR=`expr ${LINR} + 1`
    
    
    done < $FILE2
    
     
  12. #11 Gott_in_schwarz, 19.11.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Statt
    Code:
    `foo_funtion`
    if [ $? -eq 0]; then
        #....
    geht auch einfach:
    Code:
    if foo_function; then
        #...
    Warum du eine keinen Output generierende Funktion per Command Substitution (in einer Subshell) ausführst, weiß ich nicht. Aber ich weiß ja vieles nicht.
    Auch kann man das imho kompakter (ohne extra Funktion-Boilerplate) mit awk machen (dann auch mit cmd-Substi)
    Code:
    for i in {1..50}; do
        [ -z "$(factor $i|awk '{print $3}')" ] && echo "$i is prime."
    done
    Und wenn du schon Funktionen nutzt, lokalisiere die Variablen lieber.
    Code:
    LINR=`expr ${LINR} + 1`
    kann man in bash mit builtin Integer-Arithmetik machen:
    Code:
    ((LINR++))
     
  13. #12 beomuex, 19.11.2008
    beomuex

    beomuex Routinier

    Dabei seit:
    11.03.2007
    Beiträge:
    354
    Zustimmungen:
    0
    Danke für die Tipps, aber ob ich das jetzt mit nem awk mach und hundertausend Klammern und Pipes oder über ein Array und eine if ist ja Wurst.
    Und expr und ((i++)) sind wohl genauso schnell ;-)

    BTW:

    Die Zeile 7 muss LINR=1 anstatt LINR=0 lauten.
    Sonst bekommt man immer die Zeile VOR der Zeile, deren Zeilennummer eine Primzahl ist.
     
  14. #13 bytepool, 19.11.2008
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    nope, expr ist soweit ich weiss keine built-in function, so dass du jedesmal einen neuen Prozess dafuer startest, was deutlich langsamer ist als das built-in zu benutzen.

    mfg,
    bytepool
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 Gott_in_schwarz, 19.11.2008
    Zuletzt bearbeitet: 19.11.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Nicht nur das: Die Backticks (cmd-Substitution) starten auch noch mal'n bash fork. Also effektiv zwei extra Prozesse statt null. :T
    Code:
    $ foo=0; time for i in {1..1000}; do foo=`expr $foo + 1`; done
    
    real    0m6.168s
    user    0m2.575s
    sys     0m3.184s
    $ foo=0; time for i in {1..1000}; do ((foo++)); done
    
    real    0m0.044s
    user    0m0.023s
    sys     0m0.000s
    Aber es ging mir nichtmal um performance, nur um Kosmetik. Weil das imho lesbarer ist. Das gleiche gilt für den awk oneliner. Imho einfacher zu sehen was vorgeht, weil man nicht im Skript hin und herspringen muss. (Wo ist die Funktion? Was sind die Übergabewerte? Was wird zurückgegeben?)
     
  17. #15 beomuex, 19.11.2008
    beomuex

    beomuex Routinier

    Dabei seit:
    11.03.2007
    Beiträge:
    354
    Zustimmungen:
    0
    Okay ich geb mich geschlagen :(
     
Thema:

Basteln eines Shell Scripts!

Die Seite wird geladen...

Basteln eines Shell Scripts! - Ähnliche Themen

  1. Mozilla-Maskottchen aus Papier basteln

    Mozilla-Maskottchen aus Papier basteln: Das Mozilla-Maskottchen Kit und einige seiner Verwandten kann man aus Papier herstellen. Eine Wiki-Seite von Mozilla liefert die Vorlagen dazu....
  2. [Python]GUI basteln

    [Python]GUI basteln: Hi, ich möchte für ein Python-Programm eine grafische Oberfläche zur Eingabe erstellen, als IDE nutze ich Anjuta. Gibts da auch ne andere...
  3. .deb-file für gaim2-beta2 basteln

    .deb-file für gaim2-beta2 basteln: hi, ich will mir ein .deb aus den sourcen der beta2 von gaim2 basteln, dazu habe ich die sourcen entpackt, dann in dem verzeichnis dh_make...
  4. Mit den IDE Ports basteln?

    Mit den IDE Ports basteln?: Einen schönen grüß erstmal Ich würde gerne einmal versuchen zwei Rechner über ein IDE Kabel zu verbinden, um Datenaustausch darüber zu...
  5. Ich werd morgen in der Schule einen Linux Rechner basteln *freu*

    Ich werd morgen in der Schule einen Linux Rechner basteln *freu*: Tja mit der Überschrift ist schon alles gesagt, morgen werde ich für ein Schulprojekt einen Linuxrechner Aufsetzten da wir glück haben und einen...