linux:bash

Ceci est une ancienne révision du document !


Bash

Source

Utiliser Alt+.

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)

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
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

https://stackoverflow.com/questions/2172352/in-bash-how-can-i-check-if-a-string-begins-with-some-value

[[ $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

Source

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

source

todate=$(date -d 2013-07-18 +%s)
cond=$(date -d 2014-08-19 +%s)
 
if [ $todate -ge $cond ];
then
    break
fi  
for file in *; do mv $file `echo $file | cut -d . -f 5`-VOSTFR.avi; done

Mettre la variables entre guillemets:

echo "$var"

Source

  • rediriger stderr vers stdout: 2>&1
  • tout rediriger vers un fichier: &> file

Rediriger un groupe de commandes

{
    cmd1
    cmd2
} > redirect.log

Les variables des paramètres

Source

  • $# contient le nombre de paramètres
  • $* contient tous les paramètres
  • $@ contient tous les paramètres
  • $0 est le nom du script
  • shift permet 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

Source

if [ "$(id -u)" != "0" ]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

Source

user=${SUDO_USER:-$(whoami)}

https://stackoverflow.com/questions/2953646/how-can-i-declare-and-use-boolean-variables-in-a-shell-script

the_world_is_flat=true
# ...do something interesting...
if [ "$the_world_is_flat" = true ] ; then
    echo 'Be careful not to fall off!'
fi

http://linuxcommand.org/lc3_wss0120.php

set -u
 
while [ $# -gt 0 ]; do
    case $1 in
        -f | --file )           shift
                                filename=$1
                                ;;
        -i | --interactive )    interactive=1
                                ;;
        -h | --help )           usage
                                exit
                                ;;
        * )                     usage
                                exit 1
    esac
    shift # inutile ?
done

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"

Source

SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )"

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
a=("foo" "bar")
for item in ${a[*]}
do
    echo $item
done

Ajouter un élément

Source

a=()
a+=("foo")

Inverser un tableau

Source

incremental_backups=$(echo "${incremental_backups_rev[@]} " | tac -s ' ')

Enlever le dernier caractère

Source

foo="abcde"
echo "${foo::-1}" # abcd

Enlever un préfixe

Source

v="/data/truc/foo"
prefix="/data/truc/"
 
echo ${v#"$prefix"}

Source

# 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 )

Source

: '
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=$?

Ne pas développer *

Pour éviter que * soit remplacé par tous les fichiers et dossiers du dossier courant, lancer bash -f (source).

Quitter à la moindre erreur

set -e

Changer des options pour une portion de script

Mettre la portion entre parenthèses (source) :

#!/bin/bash
 
set -eu
 
(
    set -o pipefail
    set +e
 
    false | cat
    echo "after $?"
)
 
echo "before second"
 
false | cat
echo "after $?"
 
false
echo "sould not print"

Changer la couleur du texte affiché :

Visualiser le rendu de toutes les couleurs (source) :

for x in {0..8}; do for i in {30..37}; do for a in {40..47}; do echo -ne "\e[$x;$i;$a""m\\\e[$x;$i;$a""m\e[0;37;40m "; done; echo; done; done; echo ""
 
msgcat --color=test
  • linux/bash.1752932055.txt.gz
  • Dernière modification : 2025/07/19 15:34
  • de phsw