LinuxFanClub Wiki

Υπηρεσίες, Προγραμματισμός, Εκπαίδευση ..

User Tools

Site Tools


el:programming:bash

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

Αντιμετώπιση Προβλημάτων

Κοινά Προγραμματιστικά λάθη

Λάθος έλεγχος τιμής επιστροφής της 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

Scripting

Γενικά - Περιβάλλον

BASH 4

el/programming/bash.txt · Last modified: Y/m/d H:i by vagk