Ceci est une ancienne révision du document !
Bash
Ne pas développer *
Pour éviter que * soit remplacé par tous les fichiers et dossiers du dossier courant, lancer bash -f (source).
Utiliser les arguments de la commande précédente
Utiliser Alt+.
Lire ligne par ligne
Un fichier
while read variable; do echo $variable done < fichier.txt for p in $(cat dico); do echo $p done
La boucle for lit mot par mot alors que la boucle while lit vraiment ligne par ligne.
Une commande
On peut utiliser la substitution de commande:
while read f do echo $f done < <(ls)
Substitution de commande
command substitution ou process substitution
La syntaxe <(commande) renvoie le chemin vers un fichier contenant la sortie de la commande commande (cela semble être un tube anonyme). On peut donc faire des choses comme ça:
cat <(date) # lit le contenu du fichier cat < <(date) # redirige le contenu du fichier vers l'entrée standard de cat
Conditions
if [ $1 -ge 20 ] then echo "Vous avez envoyé 20 ou plus" else echo "Vous avez envoyé moins de 20" fi if [ "$1" != "-n" ] then echo "Do something" fi
Si une chaîne de caractère commence par un motif
[[ $a == z* ]] # True if $a starts with a "z" (wildcard matching). [[ $a == "|"* ]] # True is $a starts with a "|" (| is a reserved symbol, so quoting it is mandatory) [[ $a == "z*" ]] # True if $a is equal to z* (literal matching).
Suivant le nombre de lignes retournées par une commande
if [ `commande | wc -l` -eq 0 ] then commande fi
Si une variable est définie
if [ -z "$var" ] then echo "\$var is empty or not defined" else echo "\$var is NOT empty" fi
Pour tester à la fois la définition et le contenu:
if [ "${var}" == "1" ]; then echo "var = 1" fi
Pour une variable d'environnement:
if [[ -z "${DEPLOY_ENV}" ]]; then
Si une variable contient un motif
if [ `echo $var | grep -c "motif"` == "0" ]; then echo "Pas de motif" else echo "Trouvé !" fi
Si un fichier existe
Ou n'existe pas :
if [ ! -e tasks.csv ] then rec2csv -d ";" tasks.rec > tasks.csv fi
Négation
if [ ! -e ".git" ] echo "Git folder doesn't exist" fi
Comparer deux dates
todate=$(date -d 2013-07-18 +%s) cond=$(date -d 2014-08-19 +%s) if [ $todate -ge $cond ]; then break fi
Renommer tous les fichiers d'un dossier
for file in *; do mv $file `echo $file | cut -d . -f 5`-VOSTFR.avi; done
Conserver les retours à la ligne en affichant une variable
Mettre la variables entre guillemets:
echo "$var"
Rediriger les flux de sortie
- rediriger
stderrversstdout:2>&1 - tout rediriger vers un fichier:
&> file
Rediriger un groupe de commandes
{ cmd1 cmd2 } > redirect.log
Variables particulières
Les variables des paramètres
$#contient le nombre de paramètres$*contient tous les paramètres$@contient tous les paramètres$0est le nom du scriptshiftpermet de décaler les paramètres.
$* et $@ sont identiques si ces variables ne sont pas utilisées entre guillemets: elles contiennent tous les arguments, lorsque plusieurs mots étaient entre guillemets pour former un unique paramètre, ces guillemets sont supprimés et tous les mots composants les paramètres sont considérés indépendants. “$*” contient tous les paramètres, mais considérés comme un unique paramètre; “$@” conserve les paramètres comme fournis en entrée (source).
# Si on exécute ce script avec ./script.sh "Hello World" Foo Bar rm $* # rm: cannot remove ‘Hello’: No such file or directory # rm: cannot remove ‘World’: No such file or directory # rm: cannot remove ‘Foo’: No such file or directory # rm: cannot remove ‘Bar’: No such file or directory rm $@ # rm: cannot remove ‘Hello’: No such file or directory # rm: cannot remove ‘World’: No such file or directory # rm: cannot remove ‘Foo’: No such file or directory # rm: cannot remove ‘Bar’: No such file or directory rm "$*" # rm: cannot remove ‘Hello World Foo Bar’: No such file or directory rm "$@" # rm: cannot remove ‘Hello World’: No such file or directory # rm: cannot remove ‘Foo’: No such file or directory # rm: cannot remove ‘Bar’: No such file or directory
Autres variables
$?renvoie le code de retour de la dernière commande exécutée$$est le PID du programme actuel
Savoir si le script est lancé en tant que root
if [ "$(id -u)" != "0" ]; then echo "This script must be run as root" 1>&2 exit 1 fi
Connaître l'utilisateur derrière sudo
user=${SUDO_USER:-$(whoami)}
Quitter à la moindre erreur
set -e
Booléens
the_world_is_flat=true # ...do something interesting... if [ "$the_world_is_flat" = true ] ; then echo 'Be careful not to fall off!' fi
Système d'options
http://linuxcommand.org/lc3_wss0120.php
while [ "$1" != "" ]; do case $1 in -f | --file ) shift filename=$1 ;; -i | --interactive ) interactive=1 ;; -h | --help ) usage exit ;; * ) usage exit 1 esac shift # inutile ? done
Opérations arithmétiques
https://linuxize.com/post/bash-increment-decrement-variable/
i=$((i+1)) ((i=i+1)) let "i=i+1" ((i+=1)) let "i+=1" ((i++)) ((++i)) let "i++" let "++i"
Connaître le chemin d'un script
SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )"
Boucles
Sur i:
for i in $(seq 0 5); do echo $i; done # de 0 à 5 compris for i in 0 25 50 75 100 125 150 175 200 225 250 275 300; do echo $i; done # équivalent à: for i in $(seq 0 25 300); do echo $i; done # Possibilité de factoriser: s=$(seq 1 10) for c in $c; do echo $c; done
i=1 while [ $i -le 2048 ] do echo $i; i=$((i*2)) done
Tableaux
a=("foo" "bar") for item in ${a[*]} do echo $item done
Ajouter un élément
a=() a+=("foo")
Inverser un tableau
incremental_backups=$(echo "${incremental_backups_rev[@]} " | tac -s ' ')
Chaînes de caractères
Enlever le dernier caractère
foo="abcde" echo "${foo::-1}" # abcd
Chronométrer un programme
# Précision à la seconde: start=`date +%s` stuff end=`date +%s` runtime=$((end-start)) # Précision sous la seconde: start=`date +%s.%N` stuff end=`date +%s.%N` runtime=$( echo "$end - $start" | bc -l )
Commentaires multi-lignes
: '
This is a
very neat comment
in bash
'
Récupérer le code de retour dans un pipe
Pour récupérer le code de retour de la première commande qui échoue dans un pipe (source) :
set -o pipefail gcc ... 2>&1 | tee out res=$?