Table of Contents
Bash
loops
Για να εκτελέσουμε μια εντολή π.χ. 3 φορές
for n in `seq 1 3`; do uptime;done
αριθμητικές πράξεις
βλ.http://tldp.org/LDP/abs/html/ops.html
Για να αυξήσουμε μια μεταβλητή
i=`expr $i + 1`;
ή
(( i++ ))
String parameters
Έστω ότι έχουμε μια συνάρτηση ShowMenu που εμφανίζει ένα αριθμημένο μενού.
1. Προσθήκη Χρήστη 2. Διαγραφή Χρήστη
Θέλουμε να της περάσουμε 2 strings τα οποία περιέχουν και κενό μέσα τους (“Προσθήκη Χρήστη” “Διαγραφή Χρήστη”)
ShowMenu "Προσθήκη χρήστη" "Αφαίρεση χρήστη"
Μέσα στην συνάρτηση θέλουμε να χειριστούμε τα strings ως 2 διαφορετικά (και όχι 4 λόγω των κενών). Το σημαντικό εδώ είναι η χρήση “$@” (εισαγωγικά και @ αντί για *) οπότε η for θα είναι ως εξής :
menuNum=1
for menuString in "$@" do echo "$menuNum. $menuString" menuNum=`expr $menuNum + 1` done echo "$menuNum. Έξοδος"
Input
read -p "Επιλογή:" option
Χωρίς τη χρήση enter
read -s -n1 -p "Επιλογή " option
Press Any Key
Μπορούμε να δημιουργήσουμε την παρακάτω function όταν θέλουμε απλά να σταματούμε το πρόγραμμα για να δούμε τα δεδομένα στην οθόνη
function waitForKeyPress { read -s -n1 -p "Πατήστε ένα πλήκτρο " keypress }
passwords
Για να διαβάσουμε password (χωρίς να εμφανίζεται) μπορούμε να χρησιμοποιήσουμε το παρακάτω script
#!/bin/sh read -p "Username: " uname read -s -p "Password: " passw;
Στην συνέχεια για να περάσουμε το password σε εντολή (π.χ. adduser) που το ζητάει διαλογικά 2 φορές μπορούμε να κάνουμε το εξής
(echo $pass; echo $pass; ) | adduser $uname --gecos ""
screen
Παραδείγμα1
Δημιουργία νέας οθόνης τερματικού
screen -S test1
Οριζόντια διαίρεση οθόνης
screen -X split
Μεταφορά στο κάτω παράθυρο και εκκίνηση νέας οθόνης
screen -X focus; screen
Παραδείγμα2
Δημιουργία νέας οθόνης test1 που θα τρέξει το aptitude dist-upgrade
screen -S test1 -md aptitude dist-upgrade
Δημιουργία μιας οθόνης test2 που θα τρέξει το find / -name “*.txt”
screen -S test2 -md find / -name "*.txt"&
Συνδεόμαστε στην οθόνη test1 με
screen -x test1
Εάν έχει σταματήσει και ζητάει input φεύγουμε με Ctrl-a και μετά d ή αν μπορούμε να εκτελέσουμε εντολή με
screen -X detach
Συνδεόμαστε στην οθόνη test2 με
screen -x test2
Εάν έχει σταματήσει και ζητάει input φεύγουμε με Ctrl-a και μετά d ή αν μπορούμε να εκτελέσουμε εντολή με
screen -X detach
Όταν τερματίσουν οι εντολές θα τερματίσουν και οι οθόνες αυτόματα
Παραδείγμα3
Δημιουργία νέας οθόνης και είσοδος σε αυτήν
screen -S test1
Διαίρεση της οθόνης (παραμένουμε στο πάνω μισό παράθυρο p 0. Το κάτω παράθυρο έχει όνομα p 1)
screen -S test1 -X split
Διαδοχικά : μεταφορά στο κάτω παράθυρο (focus), έναρξη νέας οθόνης (screen) στο κάτω παράθυρο, μεταφορά πίσω στο πάνω παράθυρο ( screen -S test1 -X focus)
screen -S test1 -X focus;screen; screen -S test1 -X focus
Εκτέλεση στο κατω παράθυρο : σύνδεση μέσω ssh σε απομακρυσμένο μηχάνημα (θα πρέπει να έχουμε ρυθμίσει πρώτα την δυνατότητα σύνδεσης με κλειδί - βλ. σύνδεση ssh με κλειδί)
screen -S test1 -p 1 -X stuff "ssh 192.168.1.10;`echo -ne '\015'`"
Εγκατάσταση πακέτων στο απομακρυσμένο μηχάνημα. Εκτελείται στο κάτω παράθυρο ενώ εμείς είμαστε στο πάνω
screen -S test1 -p 1 -X stuff "aptitude -y dist-upgrade;`echo -ne '\015'`"
Έξοδος από το απομακρυσμένο μηχάνημα
screen -S test1 -p 1 -X stuff "exit;`echo -ne '\015'`"
Απόκρυψη του κάτω παραθύρου
screen -S test1 -X only
Τερματισμός διαδοχικά των δύο παραθύρων, άρα και έξοδος από την οθόνη test1
screen -S test1 -X kill screen -S test1 -X kill
Debug
Αντιμετώπιση Προβλημάτων
Κοινά Προγραμματιστικά λάθη
(βλ επίσης : http://wooledge.org:8000/BashPitfalls)
Λάθος έλεγχος τιμής επιστροφής της testfunc
if [testfunc]
Σωστό
if [ testfunc ]
Λάθος έλεγχος τιμής μεταβλητής.
Έτσι γίνεται ανάθεση και είναι πάντα true
if [ num=5 ]
Σωστό
if [ num = 5 ]
Λάθος κλήση function που έχει εντολή exit.
Δεν πρόκειται να κάνει έξοδο από όλο το script. Απλά κάνει return
$(myfunc)
Σωστό
myfunc
Λάθος επιστροφή τιμής από function (πεδίο τιμών 0..255)
return_test () # Returns whatever passed to it. { return $1 } return_test 260 echo $? # Returns 4
Ανάθεση $@ σε μεταβλητή
allparams="$@" echo -e "\$allparams" for param in $allparams; do echo "$param" done echo -e "\n\$@" for param in $@; do echo "$param" done echo -e "\n\"\$allparams\"" for param in "$allparams"; do echo "$param" done echo -e "\n\"\$@\"" for param in "$@"; do echo "$param" done
Εκτέλεση
testparams "1a 1b" 2 $allparams 1a 1b 2 $@ 1a 1b 2 "$allparams" 1a 1b 2 "$@" 1a 1b 2
Πηγές
Guides
- Ελληνικό tutorial : http://sidux.gr/forum/howtos/aeoaaua-oa-bash-scripting/
- Quick guides - tutorials :
- inside scripts : http://linuxsig.org/files/bash_scripting.html
- in command line : http://www.hypexr.org/bash_tutorial.php
- Bash scripting Tutorial : http://www.linuxconfig.org/Bash_scripting_Tutorial
- Books
- Βήμα βήμα η γραμμή εντολών και το κέλυφος bash : http://www.linuxcommand.org/
- Bash tutorials and tips : http://bashcurescancer.com
- Εγχειρίδιο Bash : http://tiswww.case.edu/php/chet/bash/bashref.html
- HOWTOs :
- examples pipes
- tricks and cool solutions:
- Overwrite a console line in Bash : http://slashhome.wordpress.com/2007/09/06/overwrite-a-console-line-in-bash/
- default folder group and permissions
- screen
Scripting
- Bash parameters and parameter expansions
- Loops
- Variable substitutions
- Number expansion
- Parsing arguments with getopt(s)
- Common switches : http://www.shelldorado.com/goodcoding/cmdargs.html
- source, eval exec
- Functions
- Passing variables by value-reference
- χειρισμός passwords :
- compare operators :
- Πράξεις
- Arrays
- Κοινά λάθη : http://wooledge.org:8000/BashPitfalls
- Πρακτικές ασφαλείας :
- Key detect (arrows, Fn etc)
- http://www.codelibary.com/Bash/Arrow key detect.html
- Parallel commands
- Date and time manipulation
- ncurses - dialog : Για δημιουργία μενού
- examples : /usr/share/doc/dialog/examples
- Debugger :
- bashdb : http://bashdb.sourceforge.net/
- vim
- debug technique : http://www.cyberciti.biz/tips/debugging-shell-script.html
- Command order of precedence :
- Built-in functions
- Parenthesis
Γενικά - Περιβάλλον
- Προχωρημένη ανακατεύθυνση
- stdout+error to file and terminal : http://www.travishartwell.net/blog/2006/08/19_2220
- function redirection and duplicate log to screen : http://www.linuxjournal.com/content/more-bash-redirections
- (όπου amp; είναι λάθος, αντικατέστησε με &) : http://learnlinux.tsf.org.za/courses/build/shell-scripting/ch12s04.html
- Command-line history στο bash : http://www.catonmat.net/blog/the-definitive-guide-to-bash-command-line-history/
- Colors
- colors and positions : http://wiki.archlinux.org/index.php/Color_Bash_Prompt
- colors and styles : http://edoceo.com/liber/linux-bash-shell
- localization : http://tldp.org/LDP/abs/html/localization.html
- scripts as daemons :
- commands overview
- util-linux : http://www.catonmat.net/blog/util-linux-cheat-sheet/
