Σελίδα 1 από 1

Προγραμματισμός κελύφους

ΔημοσίευσηΔημοσιεύτηκε: 28 Οκτ 2008, 13:04
από Dimitris
Προγραμματισμός κελύφους (bash)

To bash είναι ένα κέλυφος, όπως το csh, tcsh, zsh, ksh και άλλα. Είναι το προεπιλεγμένο κέλυφος για το ubuntu. To κέλυφος παρέχει ένα τρόπο επικοινωνίας του χρήστη με το λειτουργικό, είτε ενεργά (interactively) ή παθητικά (non-interactively). Ενεργά σημαίνει ότι οι εντολές εισάγονται από το πληκτρολόγιο από το χρήστη ενώ παθητικά εννοούμε ότι οι εντολές εκτελούνται από ένα αρχείο.

Αν μια εντολή ξεκινάει με # τότε θεωρείται από το bash ως σχόλιο και αγνοείται. Οι εντολές μπορούν να χωριστούν χονδρικά σε τεσσερις κατηγορίες:

  • Απλές εντολές
  • Αγωγοί (pipelines)
  • Λίστες
  • Σύνθετες εντολές

Οι απλές εντολές είναι ακολουθία λέξεων και κενών, όπως
Κώδικας: Επιλογή όλων
cd ~/Documents

Oι αγωγοί | διοχετεύουν το αποτέλεσμα της πρώτης εντολής στη δεύτερη
Κώδικας: Επιλογή όλων
ls | grep myfile

Οι λίστες είναι ακολουθία εντολών που εκτελούνται η μία μετά την άλλη
Κώδικας: Επιλογή όλων
cd ~/Documents; ls; cd

Οι σύνθετες εντολές περιλαμβάνουν βρόγχους και εντολές ελέγχου.

Το κέλυφος μπορεί να χρησιμοποιηθεί σαν μια αυτόνομη γλώσσα προγραμματισμού μιας και περιέχει όλα τα χαρακτηριστικά όπως πρόσθεση, πολλαπλασιασμός, βρόγχους, στοιχεία ελέγχου κ.α. που απαιτεί μια γλώσσα προγραμματισμού. Η εκτέλεση ενός προγράμματος κελύφους, ας πούμε του αρχείου myscript, γίνεται ως εξής:
bash myscript
Για ευκολία μπορούμε να εισάγουμε ως πρώτη γραμμή του αρχείου myscript τη γραμμή:
Κώδικας: Επιλογή όλων
#!/bin/bash

και να αλλάξουμε τα δικαιώματα του αρχείου σε εκτελέσιμο
Κώδικας: Επιλογή όλων
chmod u+x myscript

Tώρα μπορούμε να το εκτελέσουμε και ως
Κώδικας: Επιλογή όλων
./myscript

Στην περίπτωση αυτή το # δεν λειτουργεί ως σχόλιο, η μόνη εξαίρεση, αλλά σε συνδυασμό με τo ! δηλώνει ότι πρόκειται για πρόγραμμα κέλυφους bash.

To κλασσικό παράδειγμα "Hallo World" στους προγραμματιστές θα φαίνοταν στο bash:
Κώδικας: Επιλογή όλων
#!/bin/bash
echo Hallo World

που τυπώνει απλώς στην οθονη το "Hallo World".

Όπως στις περισσότερες γλώσσες προγραμματισμού υπάρχουν οι έννοιες τυπική έξοδος (stdout), τυπική είσοδος (stdin), τυπικό λάθος (stderr). Η τυπική έξοδος και το τυπικό λάθος είναι συνήθως η οθόνη, ενώ η τυπική είσοδος το πληκτρολόγιο. Μπορούμε όμως να αναδιοχετεύσουμε όλα αυτά.

  • stdout σε αρχείο
    Κώδικας: Επιλογή όλων
    ls -l > result1.txt

    Το αποτέλεσμα της εντολής ls-l αποθηκεύεται στο αρχείο result1.txt.
    Κώδικας: Επιλογή όλων
    ls -l >> result1.txt

    Εδώ τo αποτέλεσμα της εντολής ls -l θα αποθηκευτεί στο αρχείο result1.txt. Αν υπάρχει το αρχείο τότε θα γραφεί στο τέλος του αρχείου χωρις να διαγράψει τα προηγούμενα.
  • stderr σε αρχείο
    Κώδικας: Επιλογή όλων
    cd blah 2> err.txt
    cd blah >& err.txt

    Διοχετεύει το λάθος μήνυμα, σε περιπτωση που δεν υπάρχει ο φάκελος blah, στο αρχείο err.txt.

Στα προγράμματα κελύφους είναι πολύ εύκολο να διαβάσουμε τα ορίσματα του προγράμματος με τις μεταβλητές $0, $1, $2, ..., οι οποίες δηλώνουν το όνομα του προγράμματος με$0 και επειτα το πρώτο, δεύτερο όρισμα κ.ο.κ. To παρακάτω πρόγραμμα τυπώνει στην οθόνη το όνομα του προγράμματος (του αρχείου) και το πρώτο όρισμα.

Κώδικας: Επιλογή όλων
#!/bin/bash
echo $0, $1


grep

Η εντολή grep είναι από τις πλέον ισχυρές εντολές στο linux. H χρήση της συνήθως συνδυάζεται με τους διαύλους (pipes). Σκοπός της είναι η αναζήτηση μιας ακολουθίας χαρακτήρων σε ένα κείμενο. Αλλά ας δούμε ένα παράδειγμα. To αποτέλεσμα της εντολής:
Κώδικας: Επιλογή όλων
ps aux

είναι όλες οι δειργασίες που εκτελουνται στον υπολογιστή μας από όλους τους χρήστες και όπως φαντάζεστε είναι αρκετά μακροσκελές. Εμείς όμως ψάχνουμε το id μιας συγκεκριμένης διεργασίας, η οποία ξέρουμε ότι περιέχει το συνδυασμό γραμμάτων qti. Για να αναζητήσουμε αυτή τη διεργασία διοχετεύουμε το αποτέλεσμα της εντολής ps aux με ένα δίαυλο στην εντολή grep:
Κώδικας: Επιλογή όλων
ps aux | grep qti

η οποία μετά αναζητεί το συνδυασμό χαρακτήρων qti και επιστρέφει μόνο εκείνες τις γραμμές που περιεχουν αυτό το συνδυασμό. Φυσικά η χρήση διαύλων δε περιορίζεται μόνο σε έναν:
Κώδικας: Επιλογή όλων
ps aux | grep qti | grep wx

(Eίναι πολύ πιθανό η παραπάνω εντολές να μην επιστρέψουν τίποτε αν δεν υπάρχουν διεργασίες με τετοιους συνδυασμούς γραμμάτων στο όνομά τους.)


Creative Commons License
Η εργασία υπάγεται στην άδεια Creative Commons Αναφορά-Παρόμοια διανομή 3.0 Ελλάδα

Re: Προγραμματισμός κελύφους

ΔημοσίευσηΔημοσιεύτηκε: 28 Οκτ 2008, 13:05
από Dimitris
awk

Η awk είναι μια ακόμη γλώσσα προγραμματισμού που χρησιμοποιείται συνήθως σε συνδυασμό με προγράμματα κελύφους. Σκοπός της είναι να διευκολύνει την αναζήτηση σε αρχεία για ένα συγκεκριμένο μόρφωμα (pattern). Μπορεί να χρησιμοποιηθεί είτε ως εντολή από το τερματικό:
Κώδικας: Επιλογή όλων
awk 'source code' input-file1 input-file2

ή αν το πρόγραμμα είναι αρκετά μεγάλο να εκτελεστεί από ένα αρχείο:
Κώδικας: Επιλογή όλων
awk -f program-file input-file1 input-file2 ...

Ένα απλό πρόγραμμα awk είναι το εξής:
Κώδικας: Επιλογή όλων
awk '{ print }'

το οποίο τυπώνει ό,τι γράψετε στην οθόνη (όχι με ανεξίτηλο μαρκαδόρο γιατι δε θα σβήνει μετα με τίποτε).
Ένα πιο χρήσιμο πρόγραμμα θα μπορούσε να είναι το εξής:
Κώδικας: Επιλογή όλων
ps aux | awk '/foo/ { print $2 }'

το οποίο τυπώνει τη δεύτερη στήλη της εντολής ps μόνο αν μία συγκεκριμένη γραμμή περιέχει την ακολουθία foo.

Re: Προγραμματισμός κελύφους

ΔημοσίευσηΔημοσιεύτηκε: 28 Οκτ 2008, 13:05
από Dimitris
sed

H sed είναι κι αυτή μια γλώσσα προγραμματισμού για μαζική επεξεργασία κειμένου. Ο όρος μαζική αναφέρεται στην αλλάγη για παράδειγμα μιας ακολουθίας γραμματων με μία άλλη σε πολλά αρχεία. Δε θέλουμε φυσικά να κάνουμε αυτή τη δουλειά για όλα τα αρχεία με το χερί, γι'αυτό και υπάρχουν αυτά τα εργαλεία που την αυτοματοποιούν.

Aς υποθέσουμε ότι θέλουμε να αλλάξουμε σε ένα αρχείο, χωρίς να το ανοίξουμε με κάποιο πρόγραμμα, όλες τις εμφανίσεις της λέξης foo σε man. To αρχικό αρχείο είναι το old και αποθηκεύουμαι τις αλλαγές στο new. Αυτό γίνεται πολύ απλά με την παρακάτω εντολή:
Κώδικας: Επιλογή όλων
sed s/foo/man/ < old > new

Re: Προγραμματισμός κελύφους

ΔημοσίευσηΔημοσιεύτηκε: 08 Ιαν 2009, 21:02
από thodoris_turtle
Να ρωτησω? μπορουμε εχουμε δικαιωμα να εμπλουτισουμε τον ογηγο και με δικα μας παραδειγματα απλα ? :?:

Re: Προγραμματισμός κελύφους

ΔημοσίευσηΔημοσιεύτηκε: 02 Μάιος 2011, 02:18
από giannosfor
Dimitris έγραψε:Προγραμματισμός κελύφους (bash)

Πολύ ωραίος οδηγός,που μπορούμε να βρούμε ένα εκτενέστερο ? :thumbup:

Re: Προγραμματισμός κελύφους

ΔημοσίευσηΔημοσιεύτηκε: 02 Μάιος 2011, 23:43
από Star_Light
thodoris_turtle έγραψε:Να ρωτησω? μπορουμε εχουμε δικαιωμα να εμπλουτισουμε τον ογηγο και με δικα μας παραδειγματα απλα ? :?:


ΜΠορείς να γράψεις οτι θέλεις σχετικα με τον οδηγό και εδω
επισημανσεις - απορίες - διορθωσεις κτλπ κτλπ :)

Re: Προγραμματισμός κελύφους

ΔημοσίευσηΔημοσιεύτηκε: 03 Μάιος 2011, 00:16
από c7p
Αν μάθεις να χρησιμοποιείς τις εντολές για να κάνεις την δουλειά που θέλεις, μετά το να γράψεις ένα σενάριο/script είναι εύκολη υπόθεση.
Οπότε αυτό που μπορείς να κάνεις είναι να ψάξεις περισσότερες πληροφορίες για τα κελύφη και τις εντολές τους. Π.χ μπορείς να δεις τα παρακάτω (στα αγγλικά)

http://tuxradar.com/content/master-linux-command-line
http://tuxradar.com/content/command-line-tricks-smart-geeks
http://tuxradar.com/content/bash-tips-power-users
http://tuxradar.com/content/z-shell-made-easy

με μια αναζήτηση στο google μπορείς να βρεις τα πάντα όλα και να διαλέξεις αυτό που σου ταιριάζει.

Re: Προγραμματισμός κελύφους

ΔημοσίευσηΔημοσιεύτηκε: 03 Μάιος 2011, 02:06
από Star_Light
@giannosfor

Μπορεις να ψάξεις και στο youtube εχει οπτικο ακουστικο υλικο

http://www.youtube.com/watch?v=zBsT1aW5 ... grec_index

μπορείς να κοιτάξεις και στην σελίδα με τα εργαστηρια της παλιας μου σχολης

http://evdoxos.ds.unipi.gr/modules/docu ... 28b724017r

Σε γενικες είναι οπως πολυ σωστά τα λεει και ο c7p ειδικα αμα εχεις ασχοληθει ηδη με μια γλωσσα προγραμματισμου δεν θα δυσκολευτεις

καθως πολλες απο τις εντολες επαναλαμβανονται... εδω θα ξαναδεις και τους βρογχους επανάληψης while - for την συνθηκη ελεγχου

if ενα πολυ προχειρο παραδειγμα που εφτιαξα ειναι το παρακατω

Κώδικας: Επιλογή όλων
#!/bin/bash

        x=1
        y=2

        if      [$x==$y]

        then

        echo"We are going outside"
        else
        echo "We arent going outside"
        fi

        for i   in 1 2 3 
        do     
        echo "Welcome"
        done
 


Για να παίξεις στο bash scripting

άνοιξε οποιον κειμενογραφο θέλεις εγω το ανοιξα με τον nano

Κώδικας: Επιλογή όλων
sudo nano my_first_script.sh


μολις τελειωσεις αποθηκευεσε το και μετα καντο εκτελεσιμο

Κώδικας: Επιλογή όλων
chmod +x my_first_script.sh


μετα μπορεις να το εκτελεσεις με 2 τροπους... εναν που αναφερεται εδω απο τον οδηγο του φιλου μας
και εναν αλλον που ειχε πει ο σιμος παλαιοτερα...

είτε το τρέχεις δηλαδη απλα ετσι

Κώδικας: Επιλογή όλων
./my_first_script_sh


ειτε το αντιγραφεις στον /usr/bin
Κώδικας: Επιλογή όλων
cp /home/username/my_first_script.sh /usr/bin


οποτε μετα απο οποιοδηποτε σημειο(path) του κελυφους μπορεις να το καλεσεις απλα με το ονομα του

Κώδικας: Επιλογή όλων
my_first_script.sh

Re: Προγραμματισμός κελύφους

ΔημοσίευσηΔημοσιεύτηκε: 26 Μάιος 2011, 10:29
από x-dar
Dimitris έγραψε:sed

H sed είναι κι αυτή μια γλώσσα προγραμματισμού για μαζική επεξεργασία κειμένου. Ο όρος μαζική αναφέρεται στην αλλάγη για παράδειγμα μιας ακολουθίας γραμματων με μία άλλη σε πολλά αρχεία. Δε θέλουμε φυσικά να κάνουμε αυτή τη δουλειά για όλα τα αρχεία με το χερί, γι'αυτό και υπάρχουν αυτά τα εργαλεία που την αυτοματοποιούν.

Aς υποθέσουμε ότι θέλουμε να αλλάξουμε σε ένα αρχείο, χωρίς να το ανοίξουμε με κάποιο πρόγραμμα, όλες τις εμφανίσεις της λέξης foo σε man. To αρχικό αρχείο είναι το old και αποθηκεύουμαι τις αλλαγές στο new. Αυτό γίνεται πολύ απλά με την παρακάτω εντολή:
Κώδικας: Επιλογή όλων
sed s/foo/man/ < old > new

ωραίο, μόνο που αλλάζει μόνο την πρώτη συμβολοσειρά foo που βλέπει σε man.Αν θέλουμε να τις αλλάξει όλες τις foo πρέπει να δώσουμε:
Κώδικας: Επιλογή όλων
sed 's/foo/man/g' < old > new

αλλα και σκέτη να τη δώσεις την εντολή σε κονσόλα (
Κώδικας: Επιλογή όλων
sed 's/foo/man/g'
) οτι γράψεις στο αλλάζει αμέσως από κάτω σε νέα γραμμη και περιμένει να ξαναγράψεις.
Μεχρι να πατήσεις Ctrl+R