Σημειώσεις:Bourne Again Shell (BASH)

Από OSLab

To bash είναι η έκδοση GNU του αρχικού Bourne shell (/bin/sh). Σε αυτήν την ανανεωτική προσπάθεια ενός κλασικού κελύφους του UNIX δανείστηκαν αρκετά στοιχεία από την οικογένεια των επίσης δημοφιλών κελυφών csh. Πρόκειται για το default κέλυφος του Linux και είναι αυτό που ορίζεται αυτόματα στην δημιουργία των νέων λογαριασμών χρηστών.

Πίνακας περιεχομένων

Αρχεία αρχικοποίησης

Όταν ξεκινά ένα κέλυφος bash, διαβάζονται με την σειρά ορισμένα αρχεία του χρήστη, τα οποία αρχικοποιούν κατάλληλα το shell σύμφωνα με τις προτιμήσεις του χρήστη. Tα αρχεία αυτά είναι (με την σειρά που αναφέρονται):

  • /etc/profile
  • ~/.bash_profile
  • ~/.bash_login
  • ~/.profile
  • ~/.bashrc

Από τα παραπάνω αρχεία το πρώτο είναι αρχείο του συστήματος και ελέγχεται μόνο από τον διαχειριστή του συστήματος (root). Σε αυτό τίθενται οι κοινές παράμετροι για όλους τους χρήστες του συστήματος.

Όρισε ότι θα φυλάει τις τελευταίες 50 εντολές:

 HSTSIZE=50

Όρισε το prompt:

 PS1=' \ w: Command \!$'

Tα κυριότερα χαρακτηριστικά του bash μπορούν vα συνοψιστούν στα παρακάτω:

  • Ανακατεύθυνση εισόδου και εξόδου
  • Επιτρέπει wildcard χαρακτήρες
  • Μεταβλητές κελύφους για εξατομίκευση του περιβάλλοντος
  • Ιστορία εντολών (πρόσβαση σε προηγούμενες εντολές) Αριθμητική ακεραίων
  • Υπολογισμό αριθμητικών εκφράσεων
  • Ψευδώνυμα εντολών (aliasing)
  • Έλεγχο διεργασιών (job control)
  • Προγραμματιστικές αρχές (διαθέτει μεταβλητές, δομές ελέγχου κλπ.)


Πως καλείται

To bash μπορεί να κληθεί από την γραμμή εντολών ως:

 bash [options] [arguments]

Οι διαθέσιμες επιλογές (options) για την έναρξη του bash είναι οι εξής:

  • -c str: Διάβασε ως εντολή του κελύφους το string str.
  • -i: Δημιούργησε ένα αλληλεπιδραστικό (interactive) κέλυφος.
  • --help: Τυπώνει στην οθόνη μία βασική βοήθεια.
  • --login: Συμπεριφέρεται ως login shell (το κέλυφος που ξεκινά όταν ο χρήστης εισάγεται στο σύστημα). Διαβάζει με την σειρά όλα τα αρχεία που αναφέρθηκαν στην προηγούμενη ενότητα.
  • --noprofile: Ξεκινά χωρίς να διαβάσει τα αρχεία αρχικοποίησης.
  • -r: Δημιουργεί ένα περιορισμένο περιβάλλον (restricted) στο οποίο ο χρήστης δεν μπορεί να αλλάξει τον αρχικό κατάλογο ή να χρησιμοποιήσει ανακατευθύνσεις σε αρχεία.
  • -s: Διαβάζει ως είσοδο το standard input. H έξοδος των εντολών διοχετεύεται στο standard output (file descriptor 1). Οποιαδήποτε άλλη έξοδος στον file descriptor 2 (standard error).
  • -v: Verbose. Τυπώνει την κάθε γραμμή καθώς την εκτελεί. Πολύ χρήσιμο για debugging.

Ορίσματα γραμμής εντολών

Τα ορίσματα γραμμής εντολών (arguments) χρησιμοποιούνται μέσα από το κέλυφος με τις προκαθορισμένες μεταβλητές $1, $2, ... που αντιστοιχούν στο αντίστοιχο όρισμα.


Σύνταξη

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

Μεταχαρακτήρες αρχείων

Με την έννοια μεταχαρακτήρες αρχείων εννοούμε τους χαρακτήρες με την βοήθεια των οποίων μπορούμε να περιγράψουμε τους χαρακτήρες που περιέχονται στα ονόματα των αρχείων που βρίσκονται στο σύστημα αρχείων του συστήματος. Ο παρακάτω πίνακας παρουσιάζει τους κυριότερους τέτοιους μεταχαρακτήρες.

Χαρακτήρας Περιγραφή
*
Ταιριάζει σε οποιοδήποτε string με μηδέν ή περισσότερους χαρακτήρες
?
Ταιριάζει σε οποιονδήποτε μονό χαρακτήρα
[abc...]
Ταιριάζει σε οποιοδήποτε από τα γράμματα a, b, c
[a-z...]
Ταιριάζει σε οποιοδήποτε από τα γράμματα βρίσκεται στο εύρος των a-z στο ASCII αλφάβητο (επιτρέπεται επίσης π.χ. [A-Za-zO-9])
[!abc...]
Δεν ταιριάζει σε κανένα από τα γράμματα a, b, c
{strl,...}
Ταιριάζει μόνο σε κάποιο από τα strings strl,...
~όνομα
Αντικαθίσταται από τον χρήστη όνομα
~ + Αντικαθίσταται από το μονοπάτι του τρέχοντος καταλόγου

Παραδείγματα:

Τύπωσε όλα τα αρχεία που το όνομά τους ορχίζει με new

 $ ls new*

Τύπωσε όλα τα αρχεία που το όνομά τους αρχίζει με new και τελειώνει με txt

 $ ls new*txt

Ταιριάζει στο file1, file2, files, κλπ

 $ cat file?

Όλα τα αρχεία με όνομα που αρχίζει με κεφαλαίο γράμμα

 $ ls [A-Z]*

Όλα τα αρχεία με όνομα που αρχίζει με μικρό γράμμα και τελειώνει σε ένα ψηφίο

 $ ls [a-z]* [0-9]

Όλα τα αρχεία με όνομα που αρχίζουν με file ή chap ακολουθούμενο από έναν αριθμό.

 $ file {file,chap}[0-9]


Η γραμμή εντολών

Η γραμμή εντολών είναι ένα πολύ δυνατό εργαλείο από το οποίο ο χρήστης εισάγει τις προς εκτέλεση εντολές. Για τον λόγο αυτό, έχει δοθεί αρκετή έμφαση στην φιλικότητα αυτού του εργαλείου. Υπάρχουν ορισμένες εντολές (συνήθως με χρήση του πλήκτρου Control) οι οποίες διευκολύνουν τον χρήστη όσο είναι σε γραμμή εντολών.

Εντολή Περιγραφή
Crtl-B Μετακίνηση πίσω ενός χαρακτήρα (χωρίς διαγραφή)
Crtl-F Μετακίνηση μπροστά ενός χαρακτήρα (χωρίς διαγραφή)
Ctrl-A Μετακίνηση στην αρχή της γραμμής εντολών
Ctrl-E Μετακίνηση στο τέλος της γραμμής εντολών

Del Διαγραφή ενός χαρακτήρα προς τα πίσω
Ctrl-D Διαγραφή ενός χαρακτήρα προς τα εμπρός
Ctrl-K Διαγραφή από το τρέχον σημείο μέχρι το τέλος της γραμμής
Ctrl-U Διαγραφή από το τρέχον σημείο μέχρι την αρχή της γραμμής

Ctrl-P Δείχνει την προηγούμενη εντολή από το ιστορικό εντολών
Ctrl-N Δείχνει την επόμενη εντολή από το ιστορικό εντολών

Tab Συμπληρώνει την γραμμή με όνομα εντολής ή αρχείου
Esc ? Παρουσιάζει όλες τις δυνατές συμπληρώσεις
Esc @ Προσπαθεί να συμπληρώσει όνομα υπολογιστή (από το /etc/hosts)
Esc $ Προσπαθεί να συμπληρώσει όνομα μεταβλητής

Ctrl-L Καθαρίζει την οθόνη

Ειδικοί χαρακτήρες

Οι χαρακτήρες που εμφανίζονται στον παρακάτω πίνακα έχουν ειδική χρήση στο bash.

Χαρακτήρας Περιγραφή
' Διαχωριστικός χαρακτήρας εντολών
& Εκτέλεση διαδικασίας στο παρασκήνιο (background)
( ) Ομαδοποίηση εντολών (υποκέλυφος, subshell)
{ } Block εντολών
| Pipe
> < & Χαρακτήρες ανακατεύθυνσης
* ? [ ] ~ ! Μεταχαρακτήρες αρχείων
' Αντικατάσταση εντολών
$ Χαρακτηρισμός μεταβλητών
# Σχολιασμός εντολών

Εισαγωγικά

Τα εισαγωγικά στο bash χρησιμοποιούνται για να διαφύγει (escape) η σημασία που έχουν οι ειδικοί χαρακτήρες και να είναι δυνατό να εκτυπωθούν. Υπάρχουν για τον λόγο αυτό τα διπλά και τα μονά εισαγωγικά όπως επίσης και το backslash.

Tα διπλά εισαγωγικά " " χρησιμοποιούνται να τυπώνονται μηνύματα που περιλαμβάνουν ειδικούς χαρακτήρες. Οτιδήποτε είναι ανάμεσα τους τυπώνεται ως έχει εκτός από τα $, ' (backquote) και φυσικά το ίδιο το διπλό εισαγωγικό πού δηλώνει το τέλος του string.

Tα μονά εισαγωγικά είναι ακόμα πιο αποτελεσματικά, καθώς δεν επιτρέπουν σε κανέναν χαρακτήρα να έχει ειδική σημασία, εκτός του εαυτού του φυσικά.

To backslash τέλος, χρησιμοποιείται για να διαφύγει η ειδική σημασία όλων εκείνων των χαρακτήρων που διατηρούν την ειδική τους σημασία μέσα στα διπλά εισαγωγικά.

Παραδείγματα:

 $ echo 'Single quotes "protect" double quotes'
 Single quotes "protect" double quotes
 
 $ echo "Escaping \"double\" quotes..."
 Escaping "double" quotes...
 
 $ echo "You have 'ls | wc -1' files in 'pwd' "
 You have 23 files in /home/aikater
 
 $ x=100
 $ echo "The value of \$x is $x"
 The value of x is 100

Τύποι σύνταξης εντολών

Στο bash υπάρχουν αρκετοί τρόποι με τους οποίους μπορούν να συνταχθούν οι εντολές. Οι πιο ενδιαφέρουσες από αυτές τις περιπτώσεις είναι αυτές των ανακατευθύνσεων και των pipes. Ο παρακάτω πίνακας παρουσιάζει τους τύπους σύνταξης των εντολών στο bash.

Σύνταξη Αποτέλεσμα
cmd & Εκτελεί την εντολή στο παρασκήνιο (background)
cmdl ; cmd2 Εκτελεί τις δύο εντολές ακολουθιακά
(cmdl ; cmd2) Εκτελεί τις δύο εντολές σε υποκέλυφος (subshell)
cmdl | cmd2 Pipe: H έξοδος της πρώτης εντολής διοχετεύεται ως είσοδος στην δεύτερη
cmdl `cmd2` Η έξοδος της δεύτερης εντολής, όρισμα της πρώτης
(cmdl && cmd2) Εκτέλεσε την δεύτερη εντολή μόνο όταν επιτύχει η πρώτη
(cmdl || cmd2) Εκτέλεσε την δεύτερη εντολή μόνο αν αποτύχει η πρώτη

Παραδείγματα:

Συμπίεσε το αρχείο στο παρασκήνιο (background)

 $ gzip file.tar &

Ακολουθιακή εκτέλεση: αλλάζει κατάλογο και δείχνει τα αρχεία

 $ cd; ls

Εκτέλεσε τις εντολές και γράψε την έξοδό τους σε αρχείο

 $ (date; who; pwd) > logfile

Τύπωσε σε εκτυπωτή τις διαδικασίες μου

 $ ps -ef | grep user | lpr

Δείξε αναλυτικά τα αρχεία C που περιέχουν το ifdef

 $ ls -l `grep -1 ifdef *.c`

Τύπωσε το αρχείο μόνο αν έχει το str

 $ grep str infile && lpr infile

Τύπωσε NO αν δεν περιέχεται το str

 $ grep str infile || echo NO


Τύποι ανακατευθύνσεων

Οι ανακατευθύνσεις (redirections) είναι ένα από τα πιο χρήσιμα εργαλεία στον προγραμματισμό κελύφους αφού επιτρέπουν με διάφορους τρόπους τους συνδυασμούς εντολών και μεταβλητών. To bash υλοποιεί όλους αυτούς τους τρόπους. Συνοπτικά εμφανίζονται στον παρακάτω πίνακα.

Ανακατεύθυνση Λειτουργία
> file Αποθήκευση εξόδου (stdout) στο file
< file Πάρε είσοδο (stdin) από το file
cmdl | cmd2 Pipe: H έξοδος (stdout) της πρώτης, είσοδος (stdin) της δεύτερης
>> file Αποθήκευση εξόδου (stdout) στο file με πρόσθεση στο τέλος του αρχείου (appending) αν υπάρχει ήδη
> | file Αποθήκευση εξόδου (stdout) στο file με επανεγραφή αν ήδη υπάρχει (force overwrite).
<> file Χρησιμοποίησε το ίδιο αρχείο για είσοδο και έξοδο
<< text Διάβασε την είσοδο μέχρι να βρεις μια γραμμή με το κείμενο text. Συνήθως για την πρόσθεση ολόκληρων κειμένων στα scripts
&> file Αποθήκευση εξόδου (stdout) και λαθών (stderr) στο file
n> file Κατεύθυνση του περιγραφέα η (file descriptor) στο file
n< file Ορισμός του file στον περιγραφέα n
>&n Αντιγραφή της εξόδους και προς τον περιγραφέα n
n>&- Κλείσιμο του περιγραφέα n για έξοδο

Στον παραπάνω πίνακα 2.5 γίνεται αναφορά στους περιγραφείς αρχείων (file descriptors). Αυτοί είναι ακέραιοι αριθμοί οι οποίοι είναι μοναδικοί για κάθε ανοικτό αρχείο μέσα από το κέλυφος. Σε επίπεδο προγραμματισμού είναι οι τιμές που επιστρέφουν κλήσεις συστήματος όπως η open(). Σε κάθε κέλυφος, είναι ήδη ανοικτοί πάντα τρείς τέτοιοι περιγραφείς: η είσοδος (standard input ή stdin), η έξοδος (standard output ή stdout) και η έξοδος λαθών (standard error ή stderr). Η είσοδος είναι σχεδόν πάντα ταυτισμένη με το πληκτρολόγιο, ενώ η έξοδος και η έξοδος λαθών είναι η οθόνη. Οι τρεις αυτοί περιγραφείς αντιστοιχούν στους αριθμούς 0, 1 και 2.

Παραδείγματα:

Γράψε τα περιεχόμενα του parti στο book

 $ cat parti > book

Πρόσθεσε στο book τα part2 και part3

 $ cat part2 part3 >>book

Στείλε το αρχείο message με e-mail στον παραλήπτη recipient

 $ Mail recipient < message

Βρες το str στα αρχεία part? και διοχέτευσε τα λάθη στο αρχείο errorfile

 $ grep str part? 2 > errorfile 

Διάβασε μέχρι την γραμμή που περιέχει το string EOF και τύπωσε μόνο τις γραμμές που περιέχουν το test

 $ grep test << EOF </strong>
This is a test line This is not such a line Once more a test line EOF This is a test line Once more a test line


Μεταβλητές

Οι μεταβλητές στο bash ξεκινούν με το $ ενώ προαιρετικά μπορούν να βρίσκονται μέσα σε άγκιστρα. Για την ανάθεση τιμών σε μεταβλητές χρησιμοποιείται το σύμβολο ίσον = (χωρίς την χρήση του δολαρίου). Προσοχή: δεν επιτρέπονται κενά δεξιά ή αριστερά του ίσον!

Παράδειγμα:

 $ TMP=teststring 
$ echo $TMP (ή όμοια echo ${TMP})

Μπορούν επίσης να οριστούν και πίνακες μεταβλητών με χρήση των αγκυλών. Στην περίπτωση αυτή χρειάζονται οπωσδήποτε τα άγκιστρα.

Παράδειγμα:

 $ FILELIST[0]=filel
 $ FILELIST[l]=myfile2 
 $ ls ${FILELIST[1]}


Ειδικές μεταβλητές

Στο bash υπάρχει μία ειδική σειρά από μεταβλητές με ιδιαίτερη σημασία μέσα σε ένα script. Οι κυριότερες από αυτές δίνονται στον παρακάτω πίνακα.

Σημειώστε την ιδιαίτερη χρησιμότητα του $$: Μπορείτε να δημιουργείτε προσωρινά αρχεία με μοναδικό όνομα μέσα από το script. Π.χ. TMPFILE=tmp.$$. Με το $? μπορείτε επίσης να ελέγχεται αν πέτυχε η προηγούμενη εντολή που τρέξατε μέσα από το script (o κωδικός επιτυχίας είναι συνήθως το 0).

Μεταβλητή Σημασία
$0 To όνομα του script (όπως argv[0] στην C)
${n} Η η-οστό όρισμα γραμμής, 1 < η < 9 (όπως argv[n])
$# Ο ορισμός των ορισμάτων γραμμής (όπως argc)
$* $@ Όλα τα ορίσματα της γραμμής εντολών
$$ To process id της τρέχουσας διαδικασίας του bash
$? Ο κωδικός λάθους της τελευταίας εντολής που έτρεξε

Αριθμητικές εκφράσεις

To bash επιτρέπει τον υπολογισμό ακέραιων αριθμητικών εκφράσεων με χρήση της εντολής let. Επίσης, για να επιστραφεί το αποτέλεσμα μιας αριθμητικής έκφρασης απευθείας, χρησιμοποιείται το $ (( expr )).

Οι τελεστές που επιτρέπει το bash εμφανίζονται με σειρά προτεραιότητας στον παρακάτω πίνακα.

Τελεστής Πράξη
- To μείον ως πρόθεμα αρνητικών ακεραίων
! ~ Λογική άρνηση, δυαδική αντιστροφή με συμπλήρωμα κατά 1
* / % Πολλαπλασιασμός, διαίρεση, υπόλοιπο (modulo)
+ - Πρόσθεση, αφαίρεση
<< >> Shift αριστερά, Shift δεξιά
<= >= Μικρότερο ίσο, μεγαλύτερο ίσο
< > Μικρότερο, μεγαλύτερο
== ! = Ισότητα, ανισότητα
& AND (bitwise)
^ XOR (bitwise)
| OR (bitwise)
&& Λογικό AND
|| Λογικό OR
= Ανάθεση τιμών
+=, -= Ανάθεση τιμής μετά από πρόσθεση, αφαίρεση (όμοια με C)
*=, /=, %.= Ανάθεση τιμής μετά από πολ/μό, διαίρεση, υπόλοιπο
&=, |= Ανάθεση τιμής μετά από bitwise πράξεις
<<=, >>= Ανάθεση τιμής μετά από shifts

Παραδείγματα:

 $ T0DAY=`date +%-d` ; echo $(($T0DAY+7))
 $ let "count=0" "i=i+1"
 $ let "num % 2"


Ενσωματωμένες εντολές

To bash ως shell έχει την δυνατότητα να εκτελεί εντολές του συστήματος. Ωστόσο, προκειμένου να είναι κι ένα αποδοτικό εργαλείο προγραμματισμού, διαθέτει κι έναν μεγάλο αριθμό από ενσωματωμένες (built-in) εντολές που ολοκληρώνουν τα απαραίτητα εργαλεία που χρειάζεται ο χρήστης.

Στην ενότητα αυτή παρουσιάζονται μόνο οι βασικές τέτοιες εντολές, με προσανατολισμό κυρίως τις προγραμματιστικές δομές ελέγχου των scripts.

if

Είναι η βασική δομή για τον έλεγχο περιπτώσεων. Συντάσσεται με τους εξής τρόπους:

 if test-cmds then
   Cmds1
 fi 
 if test-cmds then
   Cmds1
 else
   Cmds2
 fi 
 if test-cmds then
   Cmds1
 elsif test-cmds2 then
   Cmds2
 elsif test-cmds3 then
   Cmds3
 ...
 else
   Cmds-n
 fi 

Για να εκτελεστεί επιτυχώς το then θα πρέπει η λογική συνθήκη του test-cmds (συνήθως μία εντολή test -βλ. παρακάτω- ή συνθήκη εντός αγκυλών) να επιστρέψει την τιμή 0 (επιτυχία). Ειδάλλως εκτελούνται διαδοχικά τα else και elsif.

for

Είναι η βασική δομή για την επανάληψη εντολών. Συντάσσεται με τον εξής τρόπο:

 for x [in list]
 do
   commands
 done

Ορίζει στην μεταβλητή x κάθε μία από τις τιμές της λίστας list και τρέχει τις εντολές commands. Av παραληφθεί ο ορισμός της λίστας, ως λίστα θεωρούνται τα ορίσματα τις γραμμής εντολών.

Παραδείγματα: Συνένωση όλων των αρχείων του καταλόγου σε ένα μεγαλύτερο στο προηγούμενο κατάλογο.

 for file in *
 do 
   cat $file >> ../concat.txt
 done

Έστω ότι το αρχείο filelist περιέχει μία λίστα με αρχεία στα οποία θέλουμε να ψάξουμε το string "chapter"

 for i in 'cat filelist'
 do
   echo "Looking for string chapter in file $i" 
   grep -i chapter $i
 done

while

Είναι η βασική δομή για την υπο κρητήρια επανάληψη εντολών. Συντάσσεται με τον εξής τρόπο:

 while test-cmds
 do
   commands
 done

Όσο η συνθήκες στο test-cmds επιστρέφουν 0, εκτέλεσε τις εντολές commands. Η συνθήκη ελέγχου είναι της ίδιας μορφής με την if.

Παράδειγμα: Ένας βρόγχος από 1 μέχρι 100:

 let "count=0"
 while [ $count -lt 100 ]
 do
   echo "Counter value is $count" 
let "count = count +1"
done

until

Είναι η βασική δομή για την υπο κρητήρια επανάληψη εντολών. Συντάσσεται με τον εξής τρόπο:

 until test-cmds
 do
   commands
 done

Όμοια με την while με την μόνη διαφορά ότι οι εντολές εκτελούνται τουλάχιστον μια φορά πριν γίνει έλεγχος της συνθήκης.

break

Σύνταξη:

 break [n]

Εισάγεται μέσα σε κάποιον από τους βρόγχους for, while, until και όταν κληθεί, διακόπτει τις επαναλήψεις του βρόγχου (το script συνεχίζει από την επόμενη εντολή εκτός βρόγχου). Χρησιμοποιείται δηλαδή όπως το break στην C. Προαιρετικά, και στην περίπτωση που υπάρχουν εμφωλιασμένοι βρόγχοι (nested loops) μπορεί να συνταχθεί με παράμετρο έναν ακέραιο αριθμό που δείχνει πόσους εσωτερικούς (εμφωλιασμένους) βρόγχους θα διακόψει.

continue

Σύνταξη:

 continue

Εισάγεται στους βρόγχους for, while, until και η εκτέλεση βγαίνει από την τρέχουσα επανάληψη, και συνεχίζει με την επόμενη. Η χρήση του είναι όμοια με το continue της C.

test

Σύνταξη:

 test condition

ή

 [ condition ]

Είναι η βασική εντολή ελέγχου στα scripts. Συνήθως εμφανίζεται με την δεύτερη σύνταξη (με τις αγκύλες). Η test ελέγχει συνήθως συνθήκες που αφορούν αρχεία (αλλά όχι μόνο). Δέχεται έναν μεγάλο αριθμό παραμέτρων.

Συνθήκη Έλεγχος
-a file To File υπάρχει
-b file To File είναι ειδικό αρχείο block (device)
-c file To File είναι ειδικό αρχείο character (device)
-d file To File είναι directory
-e file To File υπάρχει (exists)
-f file To File είναι ένα κανονικό (regulrar) αρχείο
-g file To File έχει Set-Group-ID bit ορισμένο
-h file To File είναι συμβολικό link (in -s . . .)
-p file To File είναι pipe (FIFO)
-r file To File μπορεί να διαβαστεί (readable)
-s file To File έχει μέγεθος μεγαλύτερο του 0
-u file To File έχει Set-User-ID bit ορισμένο
-w file To File μπορεί να γραφεί (writable)
-x file To File είναι εκτελέσιμο (executable)
-N file To File έχει αλλάξει από την τελευταία ανάγνωση
-S file To File είναι socket
f1 -nt f2 To f1 είναι νεότερο του f2
f1 -ot f2 To f1 είναι παλιότερο του f2
-n s1 To string s1 έχει μη μηδενικό μέγεθος
-z s1 To string s1 έχει μηδενικό μέγεθος
s1 = s2 Τα strings s1 και s2 είναι ίδια
s1 == s2 Τα strings s1 και s2 είναι ίδια
s1 != s2 Τα strings s1 και s2 είναι διαφορετικά
s1 < s2 To string s1 είναι μικρότερο αλφαβητικά από το s2
s1 > s2 To string s1 είναι μεγαλύτερο αλφαβητικά από το s2
string To string string δεν είναι κενό (null)
n1 -eq n2 0 n1 είναι ίσος με τον n2
n1 -ge n2 0 n1 είναι μεγαλύτερος ή ίσος με τον n2
n1 -gt n2 0 n1 είναι μεγαλύτερος από τον n2
n1 -le n2 0 n1 είναι μικρότερος ή ίσος με τον n2
n1 -It n2 0 n1 είναι μικρότερος από τον n2
n1 -ne n2 0 n1 δεν είναι ίσος με τον n2

Για να αντιστραφεί μία από τις παραπάνω συνθήκες χρησιμοποιείται το θαυμαστικό (!). Επίσης, επιτρέπονται και συνενώσεις συνθηκών με το λογικό AND (-a) και το λογικό OR (-o).

Παραδείγματα: Όσο υπάρχουν ακόμα ορίσματα...

 $ while test $# -gt 0

Όσο το πρώτο όρισμα είναι μη-άδειο...

 $ while [ -n "$1" ]

Αν το count είναι μικρότερο του 100

 $ if [ $count -lt 100 ]

Αν υπάρχει το directory Mail...

 $ if [ -d Mail ]

Αν η απάντηση δεν είναι y...

 $ if [ "$answer" != "y" ]

Αν το πρώτο όρισμα δεν είναι αναγνώσιμο ή κανονικό αρχείο...

 $ if [ ! -r "$1" -o ! -f "$1" ]

case

Σύνταξη:

 case string in 
 regex)
   commands)
 esac

Av το string ταιριάζει στην κανονική έκφραση regex τότε εκτελούνται οι εντολές commands. Av το regex είναι το *, αυτό ταιριάζει με κάθε string (είναι το αντίστοιχο της default στην C).

alias

Σύνταξη:

 alias [-p] [ name[='cmd'] ]

Ορίζει ψευδώνυμα εντολών. Με όρισμα μόνο το όνομα, δείχνει το ψευδώνυμο που αντιστοιχεί στο όνομα, ενώ με την παράμετρο -p τυπώνει όλα τα ψευδώνυμα που ισχύουν εκείνη την στιγμή.


echo

Σύνταξη:

 echo [options] [string]

Η echo τυπώνει το string στην έξοδο. Αν δεν υπάρχει κανένα όρισμα, τυπώνει απλά μία κενή γραμμή στην έξοδο. Από τις παραμέτρους της, η πιο σημαντική είναι η -n, η οποία αφού τυπώσει το string στην έξοδο, δεν αλλάζει γραμμή.


eval

Σύνταξη:

 eval [command args...]

Εκτελεί μέσα από ένα script την εξωτερική εντολή command με προαιρετικά τα ορίσματα args...


exit

Σύνταξη:

 exit [n]

Τερματίζει ένα shell script με κωδικό λάθους η. Αν δεν οριστεί το n, τότε ο κωδικός λάθους είναι αυτός της τελευταίας εντολής που έτρεξε μέσα από το script. Κωδικός λάθους 0 σημαίνει επιτυχία, οτιδήποτε άλλο αποτυχία.

Παράδειγμα:

 if [ $# -eq 0 ] ; then 
   echo "Usage: $0 [-options] file(s)
   exit 1 # Error status
 fi

export

Σύνταξη:

 export [options] [variables]
 export [options] [name=[value]]...

Με την export μία μεταβλητή του shell γίνεται μεταβλητή περιβάλλοντος ώστε να μπορεί να χρησιμοποιηθεί κι από άλλα προγράμματα. Είναι χρήσιμη στην περίπτωση που τρέχουν συνεργαζόμενα περισσότερα του ενός scripts. Με την επιλογή -p τυπώνονται όλες οι μεταβλητές που γίνονται export από το τρέχον shell. H επιλογη -n ακυρώνει το export μιας μεταβλητής.

jobs

Σύνταξη:

 jobs [options] [joblDs]

Τυπώνει όλες τις διαδικασίες που τρέχουν ή είναι σταματημένες στο τρέχον shell. Υλοποιεί τις λειτουργίες job control του bash.

Επιλογή Σημασία
-l Τυπώνει τα job IDs μαζί με το process group ID
-n Τυπώνει μόνο τα jobs που έχουν αλλάξει από την τελευταία jobs
-p Τυπώνει μόνο το process group ID
-r Τυπώνει μόνο τις διαδικασίες που τρέχουν (running)
-s Τυπώνει μόνο τις διαδικασίες που έχουν σταματήσει (stopped)


kill

Σύνταξη:

 kill [options] IDs

Στέλνει ένα signal σε μία διαδικασία. Συνήθως η kill χρησιμοποιείται για να τερματίζει μια διαδικασία (εκτός κι αν ο χειρισμός των σημάτων από την διαδικασία είναι διαφορετικός). Για να σταλεί επιτυχώς ένα σήμα, ο χρήστης πρέπει να είναι είτε ο ιδιοκτήτης της διαδικασίας, είτε ο διαχειριστής του συστήματος (root).

Επιλογή Σημασία
-signal Στέλνει το συγκεκριμένο signal στην διαδικασία
-l Τυπώνει στην οθόνη όλα τα διαθέσιμα signals


bg

Σύνταξη:

 bg [jobIDs]

Θέτει στο παρασκήνιο (background) μία διαδικασία ή την διαδικασία με job ID το jobID.


fg

Σύνταξη:

 fg [jobIDs] 

Επαναφέρει στο προσκήνιο (foreground) μία διαδικασία ή την διαδικασία με job ID το jobID.