--------------------------------------------------------------- BASH ------------------------------------------------------------------
toujours " #!/bin/sh " en début de document!
"variable:"
- pas d espace entre le signe ' = '
exemple: " va=1 "
- pas obliger d affecter des valeurs directement.
il est possible de faire " va= " et d utiliser " va " par la suite.
"les différents $":
$# = nombre d arguments
$? = statut de la dernière commande executée
exemple:
cp "$src"/"$j" "$dest"
if [ ! $? -eq 0 ]; then
print_verbose "Erreur: impossible de copier $src/$j dans $dest/${j}"
fi
$0 = nom du script courant => nom du programme appelé si dans un programme
$1 = premier argument; $2 = deuxième argument etc..
$@ = tous les arguments protégés en cas de blancs.
exemple:
for arg in "$@"; do
... # utilisation de "$arg"
done
donc si appelle d une fonction par exemple, on peut lire les argument avec $@. $* est similaire mais ne prend pas en compte les blancs.
- /!\ quand on utilise une valeur il faut mettre les doubles quotes "$… " comme "$nom" ou même on peut mettre "${nom}" comme ça
si jamais il y a des blancs dans le nom de la variable, c est correctement interprété.
"les boucles:"
- if:
structure:
if [ "$x" -eq 3 ]; then
blablabla
elif [ -e "$lol" ]; then
bloblo
fi
les options:
-n chaine la chaîne n’est pas vide
-z chaine la chaîne est vide
chaine1 = chaine2 les deux chaînes sont égales
chaine1 != chaine2 les deux chaînes sont différentes
int1 -eq int2 égalité
int1 -ne int2 différents
int1 -ge int2 ≥
int1 -gt int2 >
int1 -le int2 ≤
int1 -lt int2 <
-e name name existe
-d name name est un répertoire
-f name name est un fichier
-h name name est un lien symbolique
-r name name peut être lu
-w name name peut être écrit
-x name name peut être exécuté
- for:
structure:
for i in "$src"/*; do */
utiliser i avec "$i"
done
- while:
structure:
while [ $# -ne 0 ]; do
arg="$1"
shift
... # utilisation de "$arg"
done
- case:
structure + exemple:
case "$reponse" in
oui|Oui|OUI)
echo "OK j'efface"
rm "$choix"
continuer=0
;;
[Nn][Oo][Nn])
echo "Bon, tant pis !"
continuer=0
;;
*) echo "pas compris" ;;
esac
voir cours02 pour plus de détails.
"faire une fonction: "
- ma_fonction () {
blablabla
}
- tous script sh commence par: "#!/bin/sh" appelé le shebang, c est le nom de l interpréteur (il y en a d autre)
- quand on tape "exec ls" exec remplace le shell courant par la commande "ls".
Par défaut on a le process sh, si on fait "ls" le sh lance un autre sh dans lequel il lance ls, puis une fois les données
affichées il tue le sh qu il a créé. Quand on fait exec ls, ça remplace le shell courant par le shell dans lequel on lance sh.
- à la fin d un script on peut mettre "exit" pour quitter le shell. On peut aussi mettre "exit ?" ? étant un chiffre.
mais si on ne met rien le script se termine quand il n y a plus rien à exécuter.
- lire une variable au clavier: read ma_variable
echo "$ma_variable"
------------------------------------------------------------ C -------------------------------------------------------------------
difference entre "const char * " et " char * const "
const char * : la chaine de caractères ne peut pas être modifiée mais le pointeur oui
char * const : la chaine de caractères peut être modifiée mais pas le pointeur
- TOUJOURS tester si l allocation mémoire a réussie: malloc, calloc, realloc
"LES STRUCTURES & TYPEDEF":
les typedef:
- pour bien faire un typedef on fait:
les structure récursive:
exemples:
- classique:
struct struct {
int variable1;
char* autreVariable;
double nombreDecimal;
}NomDeVotreStructure;
- déclaration de la structure dans la structure:
typedef struct _Element Element; // NE PAS OUBLIER LE _
typedef Element* MaStructure; <<<-----
struct _Element {
int variable1;
char* variable2;
MaStructure* amis; <<<<-----
};
- allouer les variables des structures:
si on a une fonction:
void initialiserCoordonnees(Coordonnees* point){
(*point).x = 0;
(*point).y = 0;
}
ici point est une "pointeur" donc "point" est une adresse et donc on utilise *point pour acceder à l endroit pointé, ici c est une structure.
On veut accéder aux éléments de la structure pointée, donc on fait (*point).x ;
On peut aussi faire: point->x ;
Si on ce n est pas un pointeur on accède simplement à la variable comme ceci:
point.x = ...;
donc en gros:
int main(void){
Coordonnees monPoint;
Coordonnees *pointeur = &monPoint;
monPoint.x = 10; // On travaille sur une variable, on utilise le "point"
pointeur->x = 10; // On travaille sur un pointeur, on utilise la flèche
return 0;
}
"LES LIBRAIRIES":
#include <string.h> // pour tout ce qui est relatif aux strings
#include <stdlib.h> // pour les malloc calloc et realloc
#include <stdio.h> // IO pour in and out donc pour les printf et scanf
"LES STRINGS":
- char* strncpy(char* dest, char const* src, size_t n);
copie les n premiers caractères de src dans dest. Retourne dest.
Attention ! n’ajoute pas le '\0' à la fin si src contient plus de n caractères !
- char* strncat(char* dest, char const* src, size_t n);
ajoute au plus n caractères de src à la fin de dest. Retourne dest.
- int strcmp(char const* s1, char const* s2);
Compare {ordre alphabétique} les chaînes s1 et s2. Retourne un nombre négatif si s1 < s2, 0 si les deux chaînes sont identiques et un nombre positif si s1 > s2.
- int strncmp(char const* s1, char const* s2, size_t n);
comme strcmp, mais ne compare "au plus que les n premiers" caractères de chacune des chaînes.
- size_t strlen(char const * s);
Retourne le nombre de caractères dans s "sans le caractère nul de la fin \0".
- char* strchr(char const* s, char c);
Retourne un pointeur sur la première occurrence de c dans s, ou NULL si c n’est pas dans s.
- char* strrchr(char const* s, char c);
idem que strchar mais en partant de la fin. Retourne donc la dernière occurrence de c dans s.
- char* strstr(char const* s1, char const* s2);
retourne le pointeur vers la première occurrence de de s2 dans s1 (ou NULL si s2 n’est pas incluse dans s1.
- allocation dynamique de nom avec strlen(ma_string);
- définir une TAILLE_MAX pour allouer des string, comme: char nom_fichier[TAILLE_MAX];
ou
char nom_fichier = NULL; nom_fichier = malloc(TAILLE_MAX+1 * sizeof(char)); if(NULL != nom_fichier){ ... };
si on ne peut pas donner la tailler qu aura la string au moment de sa création (exemple si on a une string dans un structure).
OU ALORS faire de l allocation dynamique, déclarer:
int variable_length = strlen(variable); char* ma_string = calloc(variable_length+1, sizeof(char)); if(NULL != ma_string){ ... };
- Toujours mettre manuellement le caractère \0 en fin de string.
"LES POINTEURS":
- pour faire un swap:
void echange(int* a, int* b){
int const copie = *a;
*a = *b; // a et b sont des pointeurs, donc des adresses. Donc pour avoir accès au contenu pointé il faut faire *a et *b
*b = copie;
}
- pour une fonction qui demande ma_fonction(type* variable) il faut lui donner une adresse.
si on a type x = 0; on peut lui passer &x
si on a type* x; on peut lui passer x
si on a un pointeur sur un structure et qu on a besoin d acceder à un élément on fait
&(la_stract->mon_objet)
"quelques trucs à ne pas oublier..":
- VERIFIER si on ne pourrait pas mettre un unsigned
- VERIFIER si une variable ne pourrait pas être const
- faire des prototypes
- toujours faire des vérifications pour les nombres voir si ils sont cohérents avec ce qu on veut (<0 ou >0 etc);