Astuce

Ne jamais copier/coller du code bash d'une page Web directement dans une console. Du texte HTML (à l'aide de CSS) peut être caché entre les lignes à votre insu.

Source: Copy-Paste from Website to Terminal

String

echo a   // affiche: a
echo 'a' // affiche: a
echo "a" // affiche: a
echo "aujourd'hui" // affiche: aujourd'hui
echo 'aujourd'"'"'hui' // affiche: aujourd'hui [séparé en trois élément: 'aujourd', "'", 'hui'  (simple, double, simple guillemet)]
echo "Ceci est un "'"Test"'"." // affiche: Ceci est un "Test". [séparé en trois élément: "Ceci est un ", '"Test"', "." (double, simple, double guillemet)]

Exécutable

Un fichier exécutable (compilé) doit avoir le droit "exécutable" (chmod +x) pour être lancé avec:

./fichier
/chemin/complet/fichier

Message d'erreur lorsque le droit n'est pas présent:
bash: ./fichier: Permission non accordée

S'il s'agit d'un script, on peut le lancer avec la commande associée sans avoir de droit "exécutable", exemple:

bash fichier.sh
perl fichier.pl
...

Lorsqu'on lance un script exécutable avec le chemin (./script.sh ou /chemin/complet/fichier.pl), le programme de la première ligne est exécuté (shebang)

#!/bin/bash
#!/usr/bin/php
#!/usr/bin/nodejs
...

Shell (coquille) ou interprèteur de commande (comme le command.com de DOS)

Chaque utilisateur à ses préférences dans le fichier .bash-profile (qui est dans son répertoire d'utilisateur)

/etc/profile est le fichier de préférences globales de BASH

Touche de raccourci :

<SHIFT>+<PAGEUP>   : Défile les commandes du haut
<SHIFT>+<PAGEDOWN> : Défile les commandes du bas

<ALT>+<F1> à <ALT>+<F6> : Change de Terminal [virtuel]. 
                  On peut donc se connecter sur plusieurs comptes différents ou 
                  sur le même plusieurs fois sur la même ordinateur.

<ALT>+'L' : efface l'écran
commande <TAB> : complète automatiquement un nom de fichier... 
                 pressez une ou deux fois la touche <TAB>

Caractère de subtitution, de condition, etc...

~   : répertoire de l'usager courant [fichier /etc/passwd]
-   : répertoire précédent
*   : remplace 0 ou plusieurs caractères
?   : remplace 1 caractère
[]  : remplace par les caractères dans les braquettes individuellement
      Exemple: tp[12] donne la même chose que tp1 tp2
[-] : remplace par les caractères dans les braquettes en suivant une intervalle
      Exemple: tp[2-5] donne la même chose que tp2 tp3 tp4 tp5
[,] : remplace par les caractères dans les braquettes, puis par les autres 
      après la virgule.. etc...
      Exemple: tp[1-3,5-9] donne la même chose que: 
               tp15, tp16, tp17, tp18, tp18
               tp25, tp26, tp27, tp28, tp38
               tp35, tp36, tp37, tp38, tp28
[!] : remplace par tout à part les caractères dans les braquettes
      Exemple: tp[!1] donne tp2, tp3, tp4, etc... mais pas tp1
{,} : remplace par des chaînes séparés par des virgules
      Exemple: ri{delle,gole,dicule} donne ridelle rigole ridicule

>   : modifie la sortie d'une commande
      Exemple: ls -R > fichier    écrit le résultat de la commande ls -R vers fichier (en l'écrasant)
>>  : modifie la sortie d'une commande (en écrivant à la suite)
      Exemple: ls -R >> fichier    écrit le résultat de la commande ls -R vers fichier sans l'écraser
<   : modifie l'entrée standard
      Exemple: rm / -R < oui      efface tous les fichiers récursivement en
      envoyant la réponse 'oui' à la commande (!!! efface linux à ne pas faire !!!)

&   : Exécute une commande en arrière plan

|   : tube (pipe) redirige la sortie d'une commande vers l'entrée d'une autre
      Exemple: ls | sort | more
               envoie le résultat de 'ls' (sortie) vers la commande 'sort' (entrée)
               qui la redirige (sortie) vers la commande 'more' (entrée)

&&  : exécute une commande si la commande précédante a retourné vrai
      Exemple: test -w tp1 && echo "On peut écrire dans le fichier tp1"

||  : exécute une commande si la commande précédante a retourné faux
      Exemple: test -w tp1 !! echo "On ne peut pas écrire dans le fichier tp1"

!   : contraire d'une condition logique (!vrai = faux, !faux = vrai)

CANAUX D'ENTRÉES/SORTIES STANDARDS:
numero    nom du canal                      C/C++
#0      - clavier                           stdin   cin
#1      - écran                             stdout  cout
#2      - fenêtre d'affichage d'erreur      stderr  cerr

Exemple de redirection vers les canaux: 
ls *A 2 > LISTE     : affiche tous les fichiers finissant par 'A' et envoie 
                     toutes les erreurs (canaux 2) vers le fichier LISTE
ls *A 2 > /dev/null    : inscrit dans le périphérique null (trou noir) les erreurs.
  

Programmation

Structure de Condition

if [ condition ]; then uneInstruction; fi

if [ condition ]
then
   instruction;
   instruction;
fi

if [ condition ]
then
   instruction;
   instruction;
else
   instruction;
fi

if [ condition ]; then
 instruction;
elif 
 instruction;
else
 instruction;
fi

Référence pour les []
Référence pour opérateur de comparaison
if [ arg1 -eq arg2 ]; then NombreEstÉgalÀ; fi
if [ arg1 -ne arg2 ]; then NombreEstDifférentDe; fi
if [ $string1 == $string2 -a $string2 == $string3 ];  then
# si chaine1 est égale a chaine2 ET (-a and) chaine2 est egale a chaine3
fi
if [ $string1 == $string2 -o $string2 == $string3 ];  then
# si chaine1 est égale a chaine2 OU (-o or) chaine2 est egale a chaine3
fi
[ -e "nomfichier" ] && echo "fichier existe";
[ -e "nomfichier" ] || echo "fichier n'existe pas";
[ -x "nomfichier" ] && echo "fichier/répertoire exécutable";
[ -r "nomfichier" ] && echo "fichier avec droit de lecture";
[ -w "nomfichier" ] && echo "fichier avec droit d'écriture";
[ grep "bla" "nomfichier" ] && echo "bla est dans nomfichier";

case $var in
choix1)
 # si $var est égale à choix1 alors:
 instruction1
 ;;
choix2 | choix3)
 # si $var est égale à choix2 ou à choix3
 instruction2ou3
 ;;
esac

for i in file file2 file3; do 
 echo $i
done

function bla {
 echo $1 # parametre 1
}

 

Remarque: il ne faut pas oublier les espaces entre les crochets [ ] du if et les opérateurs (-eq, -a, ==). Car if [ 1 -eq 1 ] est vrai et if [1 -eq 1] est faux.

Entree/sortie

Sortie:
echo "chaine de caractere"
VARIABLE1=allo
echo "chaine avec une $VARIABLE1"
VARIABLE2=test
echo $VARIABLE2

Entrée:
read nomvariable
echo $nomvariable

Deux entrées dans une sortie:
(echo "def"; echo "abc") | sort  # sort
(echo "<?php \$a='abc'; ?>"; cat file.php) | php    # php variable injection

Caractères spéciaux

Son de cloche

echo $'\a';
# ou 
echo -e "\a";

# changer la fréquence du son:
echo -e "\33[10;FRÉQUENCE_en_Hertz]\33[11;DURÉE_EN_MilliSeconde]"
# Fréquence et durée par défaut:
echo -e "\33[10;750]\33[11;125]"
 

Fichiers

~/.bash_history
Liste de commandes tapées lors d'une session (1 commande par ligne)

~/.bash_logout (shell script)
Commençant par le commentaire # ~/.bash_logout, habituellement la commande clear est inscrite.

~/.bash_profile
Commençant par le commentaire # .bash_profile
Exécute le script ~/.bashrc s'il existe, unset USERNAME.

~/.bashrc (shell script)

Erreur de bash

2005/02/05

bash: child setpgid (8026 to 8026): Aucun processus de ce type

Corrigé sur glibc-2.3.3-63

Positionnement

echo -en \\033[100G  # se déplacer à la colonne 100
echo -en \\033[1\;25r # revient à la première ligne
echo -en \\033[25\;1H  # se déplacer à la ligne 25
echo -en \\033[0\;10m  # normal
echo -en \\033[1\;10m  # gras
echo -en \\033[2\;10m  # gris pâle
echo -en \\033[4\;10m  # souligné
echo -en \\033[8\;10m  # même couleur 
echo -en \\033[9\;10m  # barré

echo -en \\033[1\;31m  # failure (gras,rouge)
echo -en \\033[1\;32m  # Success (gras,vert fluo)
echo -en \\033[1\;33m  # Warning (gras,jaune)
echo -en \\033[0\;39m  # Normal (noir)
echo -en \\033[36\;44m  # Bleu clair sur fond foncé

#echo -en \\033[41. # ne fonctionne pas
#echo -en \\033[39\;49m  # ???
#echo -en \\033[K  # ???

Voir aussi /etc/sysconfig/init sur fedora/redhat/centos