====== 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 σε απομακρυσμένο μηχάνημα (θα πρέπει να έχουμε ρυθμίσει πρώτα την δυνατότητα σύνδεσης με κλειδί - βλ. [[el:linux:debian:server:ssh#ses_le|σύνδεση 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://splike.com/wiki/Bash_Scripting_FAQ#How_can_I_debug.3F) ====== Αντιμετώπιση Προβλημάτων ====== ===== Κοινά Προγραμματιστικά λάθη ===== (βλ επίσης : 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 : * tutorial : http://www.linuxconfig.org/Bash_scripting_Tutorial * 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 * [[http://sourceforge.net/projects/linuxcommand/?source=dlp|The Linux Command Line]] * Βήμα βήμα η γραμμή εντολών και το κέλυφος bash : http://www.linuxcommand.org/ * Bash tutorials and tips : http://bashcurescancer.com * Εγχειρίδιο Bash : http://tiswww.case.edu/php/chet/bash/bashref.html * HOWTOs : * http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html * examples pipes * http://www.commandlinefu.com/ * tricks and cool solutions: * http://www.cyberciti.biz/tips/spice-up-your-unix-linux-shell-scripts.html * Overwrite a console line in Bash : http://slashhome.wordpress.com/2007/09/06/overwrite-a-console-line-in-bash/ * default folder group and permissions * http://www.linuxquestions.org/questions/linux-desktop-74/applying-default-permissions-for-newly-created-files-within-a-specific-folder-605129/ * screen * http://www.jerri.de/blog/archives/2006/05/02/scripting_screen_for_fun_and_profit/ * http://www.kuro5hin.org/story/2004/3/9/16838/14935 * http://polishlinux.org/howtos/screen-tips-tricks/ ===== Scripting ===== * Bash parameters and parameter expansions * http://bash-hackers.org/wiki/doku.php/scripting/posparams * http://www.ibm.com/developerworks/library/l-bash-parameters.html?ca=drs- * http://tldp.org/LDP/abs/html/internalvariables.html * Loops * http://www.cyberciti.biz/faq/bash-for-loop/ * Variable substitutions * http://tipstricks.itmatrix.eu/?p=310 * Number expansion * http://wiki.bash-hackers.org/syntax/expansion/brace * Parsing arguments with getopt(s) * http://www.linux.com/feature/118031 * http://aplawrence.com/Unix/getopts.html * http://rsalveti.wordpress.com/2007/04/03/bash-parsing-arguments-with-getopts/ * Common switches : http://www.shelldorado.com/goodcoding/cmdargs.html * source, eval exec * http://www.unix.com/shell-programming-scripting/54347-bash-shell-exec-eval-source-looking-help-understand.html * Functions * Passing variables by value-reference * http://www.mcwalter.org/technology/shell/functions.html * http://tldp.org/LDP/abs/html/ivr.html * χειρισμός passwords : * http://www.peterbe.com/plog/passwords-with-bash * http://fakrul.wordpress.com/2006/10/09/create-user-change-password-by-bash-script/ * http://ubuntuforums.org/showthread.php?t=273944 * compare operators : * http://www.ibm.com/developerworks/linux/library/l-bash-test.html * http://devmanual.gentoo.org/tools-reference/bash/index.html * http://tldp.org/LDP/abs/html/comparison-ops.html * Πράξεις * http://tldp.org/LDP/abs/html/ops.html * Arrays * http://articles.techrepublic.com.com/5100-10878_11-5820685.html?part=rss&tag=feed&subj=tr * http://tldp.org/LDP/abs/html/arrays.html * Κοινά λάθη : http://wooledge.org:8000/BashPitfalls * Πρακτικές ασφαλείας : * http://www.davidpashley.com/articles/writing-robust-shell-scripts.html * Key detect (arrows, Fn etc) * http://www.codelibary.com/Bash/Arrow key detect.html * Parallel commands * http://pebblesinthesand.wordpress.com/2008/05/22/a-srcipt-for-running-processes-in-parallel-in-bash/ * Date and time manipulation * http://www.unix.com/answers-frequently-asked-questions/13785-yesterdays-date-date-arithmetic.html * ncurses - dialog : Για δημιουργία μενού * intro : http://www.linuxjournal.com/article/2807 * sample : http://ilug.gr/forum/index.php?topic=430.0;wap2 * examples : http://bash.cyberciti.biz/guide/Category:Interactive_scripts * examples : /usr/share/doc/dialog/examples * Debugger : * bashdb : http://bashdb.sourceforge.net/ * vim * http://www.linux.com/archive/articles/114359 * http://www.vim.org/scripts/script.php?script_id=365 * debug technique : http://www.cyberciti.biz/tips/debugging-shell-script.html * Command order of precedence : * http://www.hotaboutlinux.com/2009/02/command-order-of-precedence/ * Built-in functions * http://www.delorie.com/gnu/docs/bash/bashref_57.html * http://www.faqs.org/docs/bashman/bashref_124.html * Parenthesis * http://stackoverflow.com/questions/2188199/how-to-use-double-or-single-bracket-parentheses-curly-braces ===== Γενικά - Περιβάλλον ===== * Προχωρημένη ανακατεύθυνση * Intro : http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html * 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 * http://tldp.org/LDP/abs/html/io-redirection.html * http://en.opensuse.org/Bash * (όπου 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 : * http://ubuntuforums.org/showthread.php?t=453227 * http://www.commandlinemac.com/article.php?story=20070815131936996 * commands overview * http://tldp.org/LDP/abs/html/system.html * util-linux : http://www.catonmat.net/blog/util-linux-cheat-sheet/ ===== BASH 4 ===== * http://bash-hackers.org/wiki/doku.php/bash4