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

...το μέρος για να ξεκινήσετε!

Συντονιστής: adem1

Κανόνες Δ. Συζήτησης
Παρακαλώ να επιλέξετε, με προσοχή, την άδεια που θέλετε να έχουν οι οδηγοί που συγγράφετε.
Πληροφορίες για τις άδειες μπορείτε να βρείτε εδώ.
Άμα επιθυμείτε κάποια άλλη άδεια επικοινωνήστε με κάποιο Διαχειριστή είτε Συντονιστή.

Σημαντικό είναι να χρησιμοποιήσετε την υπηρεσία http://imagebin.ubuntu-gr.org για τις εικόνες.

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

Δημοσίευσηαπό Dimitris » 28 Οκτ 2008, 13:04

Προγραμματισμός κελύφους (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 Ελλάδα
Τελευταία επεξεργασία από Dimitris και 16 Μαρ 2010, 01:21, έχει επεξεργασθεί 1 φορά/ες συνολικά
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

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

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

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.
Τελευταία επεξεργασία από Dimitris και 28 Οκτ 2008, 13:06, έχει επεξεργασθεί 1 φορά/ες συνολικά
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

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

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

sed

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

Aς υποθέσουμε ότι θέλουμε να αλλάξουμε σε ένα αρχείο, χωρίς να το ανοίξουμε με κάποιο πρόγραμμα, όλες τις εμφανίσεις της λέξης foo σε man. To αρχικό αρχείο είναι το old και αποθηκεύουμαι τις αλλαγές στο new. Αυτό γίνεται πολύ απλά με την παρακάτω εντολή:
Κώδικας: Επιλογή όλων
sed s/foo/man/ < old > new
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

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

Δημοσίευσηαπό thodoris_turtle » 08 Ιαν 2009, 21:02

Να ρωτησω? μπορουμε εχουμε δικαιωμα να εμπλουτισουμε τον ογηγο και με δικα μας παραδειγματα απλα ? :?:
Η ζωή είναι κενή χωρίς ιδέες. Δεν υπάρχει μεγαλύτερη χαρά από τον αγώνα στο όνομά τους.

Φιντέλ Κάστρο Ρους
31 Ιούλη του 2007
Άβαταρ μέλους
thodoris_turtle
punkTUX
punkTUX
 
Δημοσιεύσεις: 187
Εγγραφή: 28 Αύγ 2008, 15:18
Τοποθεσία: Άνω Γλυφάδα
Εκτύπωση

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

Δημοσίευσηαπό giannosfor » 02 Μάιος 2011, 02:18

Dimitris έγραψε:Προγραμματισμός κελύφους (bash)

Πολύ ωραίος οδηγός,που μπορούμε να βρούμε ένα εκτενέστερο ? :thumbup:
1 Γνώσεις Linux: Καθόλου ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 12.04 precise 3.2.0-58-generic 32bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.2.0-57-generic, Microsoft Windows XP Professional
3 Intel Core2 Duo CPU E4600 2.40GHz ‖ RAM 2012 MiB ‖ ASUS INC. P5Q - � P5Q
4 nVidia G94 [GeForce 9600 GT] [10de:0622] {nvidia}
5 eth0: Qualcomm Atheros AR8121/AR8113/AR8114 Gigabit or Fast Ethernet [1969:1026] (rev b0) ⋮ wlan0: 148f:3070 Ralink Technology, Corp. RT2870/RT3070 Wireless Adapter
Άβαταρ μέλους
giannosfor
punkTUX
punkTUX
 
Δημοσιεύσεις: 297
Εγγραφή: 24 Απρ 2011, 20:24
Τοποθεσία: Ηράκλειο
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 02 Μάιος 2011, 23:43

thodoris_turtle έγραψε:Να ρωτησω? μπορουμε εχουμε δικαιωμα να εμπλουτισουμε τον ογηγο και με δικα μας παραδειγματα απλα ? :?:


ΜΠορείς να γράψεις οτι θέλεις σχετικα με τον οδηγό και εδω
επισημανσεις - απορίες - διορθωσεις κτλπ κτλπ :)
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

Δημοσίευσηαπό c7p » 03 Μάιος 2011, 00:16

Αν μάθεις να χρησιμοποιείς τις εντολές για να κάνεις την δουλειά που θέλεις, μετά το να γράψεις ένα σενάριο/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 μπορείς να βρεις τα πάντα όλα και να διαλέξεις αυτό που σου ταιριάζει.
Άβαταρ μέλους
c7p
powerTUX
powerTUX
 
Δημοσιεύσεις: 1849
Εγγραφή: 30 Μάιος 2009, 16:09
Τοποθεσία: Κατερίνη
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 03 Μάιος 2011, 02:06

@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
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

Δημοσίευσηαπό x-dar » 26 Μάιος 2011, 10:29

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
Πόσα μήλα έφαγε στο κεφάλι του ο Νεύτων πριν συλλάβει την ιδέα?
Γνώσεις ⇛ Linux: μία 6ετία ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό: Ubuntu 12.04 64bit
Προδιαγραφές ⇛ CPU: 4x Intel Core i3 CPU M 350 2.27GHz ASUS Inc. ASUS X52JC-SX011V│RAM 3811 MiB │Intel Core Processor Integrated Graphics Controller │ Micron Technology Corp. JMC250 PCI Express Gigabit Ethernet Controller │
Άβαταρ μέλους
x-dar
babeTUX
babeTUX
 
Δημοσιεύσεις: 17
Εγγραφή: 21 Νοέμ 2008, 20:45
Τοποθεσία: Balsall Common,UK
IRC: x-dar
Εκτύπωση


  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Οδηγοί - How to - Tutorials