====== 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