Utiliser Alt+.
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.
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
[[ $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).
if [ `commande | wc -l` -eq 0 ] then commande fi
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
if [ `echo $var | grep -c "motif"` == "0" ]; then echo "Pas de motif" else echo "Trouvé !" fi
Ou n'existe pas :
if [ ! -e tasks.csv ] then rec2csv -d ";" tasks.rec > tasks.csv fi
if [ ! -e ".git" ] echo "Git folder doesn't exist" fi
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"
stderr vers stdout: 2>&1&> file{ cmd1 cmd2 } > redirect.log
$# contient le nombre de paramètres$* contient tous les paramètres$@ contient tous les paramètres $0 est le nom du scriptshift 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
$? renvoie le code de retour de la dernière commande exécutée$$ est le PID du programme actuelif [ "$(id -u)" != "0" ]; then echo "This script must be run as root" 1>&2 exit 1 fi
user=${SUDO_USER:-$(whoami)}
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"
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
a=() a+=("foo")
incremental_backups=$(echo "${incremental_backups_rev[@]} " | tac -s ' ')
foo="abcde" echo "${foo::-1}" # abcd
v="/data/truc/foo" prefix="/data/truc/" echo ${v#"$prefix"}
# 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 )
: '
This is a
very neat comment
in bash
'
echo $((1 + $RANDOM % 10)) od -t u -N 4 /dev/urandom | head -n 1 | cut -f 2 -d ' '
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=$?
Pour éviter que * soit remplacé par tous les fichiers et dossiers du dossier courant, lancer bash -f (source).
set -e
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