Για να εκτελέσουμε μια εντολή π.χ. 3 φορές
for n in `seq 1 3`; do uptime;done
βλ.http://tldp.org/LDP/abs/html/ops.html
Για να αυξήσουμε μια μεταβλητή
i=`expr $i + 1`;
ή
(( i++ ))
Έστω ότι έχουμε μια συνάρτηση 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. Έξοδος"
read -p "Επιλογή:" option
read -s -n1 -p "Επιλογή " option
Μπορούμε να δημιουργήσουμε την παρακάτω function όταν θέλουμε απλά να σταματούμε το πρόγραμμα για να δούμε τα δεδομένα στην οθόνη
function waitForKeyPress { read -s -n1 -p "Πατήστε ένα πλήκτρο " keypress }
Για να διαβάσουμε password (χωρίς να εμφανίζεται) μπορούμε να χρησιμοποιήσουμε το παρακάτω script
#!/bin/sh read -p "Username: " uname read -s -p "Password: " passw;
Στην συνέχεια για να περάσουμε το password σε εντολή (π.χ. adduser) που το ζητάει διαλογικά 2 φορές μπορούμε να κάνουμε το εξής
(echo $pass; echo $pass; ) | adduser $uname --gecos ""
Δημιουργία νέας οθόνης τερματικού
screen -S test1
Οριζόντια διαίρεση οθόνης
screen -X split
Μεταφορά στο κάτω παράθυρο και εκκίνηση νέας οθόνης
screen -X focus; screen
Δημιουργία νέας οθόνης 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
Όταν τερματίσουν οι εντολές θα τερματίσουν και οι οθόνες αυτόματα
Δημιουργία νέας οθόνης και είσοδος σε αυτήν
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
(βλ επίσης : http://wooledge.org:8000/BashPitfalls)
if [testfunc]
Σωστό
if [ testfunc ]
Έτσι γίνεται ανάθεση και είναι πάντα true
if [ num=5 ]
Σωστό
if [ num = 5 ]
Δεν πρόκειται να κάνει έξοδο από όλο το script. Απλά κάνει return
$(myfunc)
Σωστό
myfunc
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