Notions de base de Shell Korn
Il s'agit d'un simple aperçu des bases du shell Korn. Le shell Korn (ksh93) est compatible POSIX et dispose de fonctionnalités plus robustes.
Sous Solaris (les versions 9 et 10), la valeur par défaut Korn shell dans /bin/ksh est en fait ksh88. Ce Korn shell (ksh88) n'est pas compatible avec la norme POSIX. Solaris (les versions 9 et 10) contient également le shell Korn (ksh93): /usr/dt/bin/dtksh.
Le système Mac OS X 10.6 a ksh93 dans /bin/ksh par défaut.
Sous Solaris (les versions 9 et 10), la valeur par défaut Korn shell dans /bin/ksh est en fait ksh88. Ce Korn shell (ksh88) n'est pas compatible avec la norme POSIX. Solaris (les versions 9 et 10) contient également le shell Korn (ksh93): /usr/dt/bin/dtksh.
Le système Mac OS X 10.6 a ksh93 dans /bin/ksh par défaut.
Sortie
.
#!/bin/bash echo "Hello"
Variables
.
declare -i num=10/2 # set an integer char=a # set a character string="This is a string" # set a string # show the results echo Number is $num echo Character is \'$char\' echo String is \"$string\"
Constantes
.
#!/bin/bash declare -r PI=3.14159265359 # declare constant echo PI equals $PI # output result # attempt to change value PI=3 # try to redefine variable echo Setting PI to 3: $PI # output result PI=$(echo "$PI+1"|bc -l) # try incrementing variable # note: bash cannot increment floats, bc used echo Incrementing PI: $PI # output result
Arithmétique
.
#!/bin/ksh # integer arithmatic width=5; length=6 area=$(($length * $width)) echo "The area of a square (width=$width, length=$length) is $area" # boolean logic true=1; false=0 result=$(($true && $false || $true)) echo "The statement (true AND false OR true) is $result"
#!/bin/bash declare -r PI=3.14159265359 # set approximation of π radius=3 # set radius area=$(echo "$PI * $radius ^ 2" | bc) # calculate area, no float in bash echo "The area of a circle is $area" # output result
#!/bin/bash # set approximation of π declare -r PI=3.14159265359 # print calculaton of cos(π/4) echo The cosine of pi/4 is: $(awk "BEGIN {print cos($PI/4)}")
Entrée
d
#!/bin/bash read -p "Enter your name: " name # print prompt & acquire input echo Hello $name # output result using variable
Choix
.
#!/bin/bash # prompt user and get input read -p "Input a number: " number # test input and output result if (( $number > 0 )); then echo Number is greater than 0 elif (( $number < 0 )); then echo Number is less than 0 else echo Number is 0 fi
#!/bin/bash read -p "Input a character: " keypress # prompt user and get input keypress=${keypress:0:1} # substring for only 1st char # case construction case "$keypress" in [[:lower:]] ) echo "Lowercase letter";; [[:upper:]] ) echo "Uppercase letter";; [[:digit:]] ) echo "Digit";; * ) echo "Punctuation, whitespace, or other";; esac
#!/bin/bash read -p "Input a character: " keypress # prompt & get input keypress=${keypress:0:1} # substring for only 1st char # test if keypress matches pattern if [[ $keypress = [[:lower:]] ]]; then echo "Lowercase letter" elif [[ $keypress = [[:upper:]] ]]; then echo "Uppercase letter" elif [[ $keypress = [[:digit:]] ]]; then echo "Digit" else echo "Punctuation, whitepace, or other" fi
Boucles
.
#!/bin/bash let count=10 # set initial state # loop 10 to 1 with while/do...done construction while (( $count > 0 )); do # test if 0 reached echo "Count is $count" # print curent count let count="$count - 1" # decrement done
#!/bin/bash # loop 10 to 1 with for/do...done construction for (( count=10; count > 0; count-- )); do echo "Count is $count" # print curent count done
#!/bin/bash # loop until user exits using until/do...done construction until [[ "$answer" = "quit" ]]; do read -p "Enter your name (quit to exit): " answer # prompt and get input if [[ $answer != "quit" ]] ; then # echo if not exiting echo Hello $answer fi done
#!/bin/bash # loop through listing with for/in/do...done for item in $(ls); do # cycle through directory listing if [[ -d $item ]]; then # test if path is directory echo "$item is a directory" else echo "$item is not a directory" fi done
Tableaux
Le shell Korn supporte les tableaux.
Ce script suivant montre la création d'un tableau et l'impression de la taille du tableau et le contenu du tableau.
Ce script suivant montre la création d'un tableau et l'impression de la taille du tableau et le contenu du tableau.
#!/bin/bash # assign items to array nicknames[0]=bob nicknames[1]=ed nicknames[2]=steve nicknames[3]=ralph nicknames[4]=joe nicknames[5]=deb nicknames[6]=kate echo "The number of nicknames are: ${#nicknames[*]}" # print lenght of array echo "The nicknames are: ${nicknames[*]}" # enumerate array
Le script suivant montre comment énumérer à travers le tableau en utilisant la boucel for.
#!/bin/bash declare -a nicknames=(bob ed steve ralph joe deb kate) echo "The names are: " for name in ${nicknames[*]}; do echo " $name" done
Le script suivant montre comment énumérer à travers le tableau avece un compteur.
#!/bin/bash declare -a nicknames=(bob ed steve ralph joe deb kate) echo "The names are: " for (( count=0; count < ${#nicknames[*]}; count++ )); do echo " nicknames[$count]=${nicknames[$count]}" done
Tableaux associatifs
Un tableau associatif est est un type de données associant à un ensemble de clefs un ensemble correspondant de valeurs. Le shell Korn supporte les tableaux associatifs.
Voici un script qui crée un tableau associatif, imprime les touches, imprime les valeurs, puis pour chaque clé, imprime la paire de clés et de valeur.
Voici un script qui crée un tableau associatif, imprime les touches, imprime les valeurs, puis pour chaque clé, imprime la paire de clés et de valeur.
#!/bin/ksh # required to declare array type typeset -A ages # individually build array ages[bob]=34 ages[ed]=58 ages[steve]=32 ages[ralph]=23 ages[deb]=46 ages[kate]=19 # print all keys and values print "Keys (names): ${!ages[@]}" print "Values (ages): ${ages[@]}"
#!/bin/ksh # need to declare array type typeset -A ages # create initial associative array ages=([bob]=34 [ed]=58 [steve]=32 [ralph]=23) # Add more with ksh93j ages+= ([deb]=46 [kate]=19) # Print Key/Value Pairs print "The ages are: " for name in ${!ages[@]} do print " ages[$name]=${ages[$name]}" done