Bash
Syntaxe Bash et autres commandes pratique.
Sommaire
- 1 Entête
- 2 Dictionnaire
- 3 Identifier et effacer les fichiers identiques
- 4 Tuer tous les processus d'un usager
- 5 Dates
- 6 Dimension d'une liste de fichiers
- 7 Sortie de la dernière commande bash
- 8 Changer l'extension
- 9 for
- 10 if
- 11 Opérations arithmétiques
- 12 Convertir de majuscules à minuscules
- 13 Variables
- 14 Array
- 15 Arguments
- 16 Redirection dans un for loop
- 17 PS1
Entête
#!/bin/bash - # # title mkscript.sh # description :This script will make a header for a bash script. # author : Miguel Tremblay https://ptaff.ca/miguel/ # date :21 janvier 2025 # # This program is free software: you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation, either version 3 of the License, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along with # this program. If not, see <http://www.gnu.org/licenses/>.
Dictionnaire
declare -A moisLettre=( ["01"]="jan" ["02"]="fév" ["03"]="mar" ["04"]="avr" ["05"]="mai" ["06"]="jun" ["07"]="jul" ["08"]="aoû" ["09"]="sep" ["10"]="oct" ["11"]="nov" ["12"]="déc" ) > echo "${moisLettre[02]}" fév
Identifier et effacer les fichiers identiques
fdupes -d REPERTOIRE
Tuer tous les processus d'un usager
Tuer les processus de l'usager qu'on est:
kill -9 -1
Dates
Itération sur les jours
d=2015-01-01 while [ "$d" != 2015-02-20 ]; do echo -n "," $d d=$(date -I -d "$d + 1 day") done
Obtenir le nombre de jours dans un mois donné
Pour le mois de février 2012 par exemple, utiliser:
cal 2 2012 |egrep -v [a-z] |wc -w
Dimension d'une liste de fichiers
Pour avoir le total des fichiers en octets:
find /path/ou/trouver/fichier -name "noms" -printf '%s\n' | awk 'BEGIN {Total=0} { Total += $1 } END { print Total }'
Aller ensuite sur ce site pour convertir le nombre obtenu dans quelque chose de décent: http://www.t1shopper.com/tools/calculate/
Sortie de la dernière commande bash
Pour récupérer la dernière valeur sortie d'une commande dans la commande suivante:
$ locate -r K3B.*ogg /usr/share/sounds/KDE-K3B-Finish-Error.ogg /usr/share/sounds/KDE-K3B-Finish-Success.ogg /usr/share/sounds/KDE-K3B-Insert-Medium.ogg
Astheure on voudrait passer ces fichiers dans mplayer, mettons.
On peut utiliser $(!!) (ou `!!` sa forme ancestrale) pour_réexécuter_ la commande puis la substituer sur le commandline :
$ mplayer $(!!)
Deviendra donc
$ mplayer $(locate -r K3B.*ogg)
Voir aussi bash - automatically capture output of last executed command into a variable.
Changer l'extension
totopdf=bonjour.pdf totopng=${totopdf%.*}.png
% : coupe à droite la plus petite string correspondant à .* %% : idem mais la plus longue string
- et ## idem mais à gauche
Ainsi :
totopdf=bonjour.bonsoir.pdf ${totopdf%.*}.png va donner bonjour.bonsoir.png MAIS ${totopdf%%.*}.png va donner bonjour.png
for
for j in `seq 0 1500`; do ... done
Boucle sur les lignes
while read LINE ; do echo "$LINE" ; done < fichier.txt
if
Existence d'un fichier
Si un fichier existe, alors:
if [ -f $FICHIER ] then echo $FICHIER "existe" fi
Si un fichier n'existe pas, alors:
if ! [ -f $FICHIER ] then echo $FICHIER "n'existe pas" fi
Dans une boucle for
Ce test confirme si le fichier existe (source). Faire attention aux espaces autour des "[" et "]", ils sont importants.
for variable in titi toto;do if [ -f $variable ]; then echo "toto"; fi;done
Arithmétique
Nombre entier
i=1 if [ "$i" -eq 1 ] ; then ... fi
Division avec nombre décimaux:
awk "BEGIN {print (20+5)/2}"
Opérations arithmétiques
Pour des opérations arithmétiques sur des variables, il faut utiliser les doubles parenthèses.
j=$(($i+1))
Pour gosser avec des entiers, il faut utiliser la commande expr
:
expr 1 + 2
Faire la somme d'une série de nombres:
echo "96 96 105 146 288 96 74 71 92 96 126 102 74" | awk '{tot=tot+$1} END {print tot}'
Si un fichier texte ne comprend que des nombres, on peut avoir le total avec la commande:
awk '{tot=tot+$1} END {print tot}' fichier.txt
Sort by number of occurrences:
some_command | sort | uniq -c | sort -nr
Convertir de majuscules à minuscules
echo $VARIABLE | tr '[:upper:]' '[:lower:]'
Variables
Comment faire pour avoir au moins 3 chiffres pour une variable
i=1 j=`printf "%02d" $i` echo $j
Une variable est-elle définie?
if [ -z ${VARIABLE+x} ]; then echo "La variable n'est pas définie" fi
Array
Déclaration
array=( zero one two three four five )
Appel
echo ${array[0]}
Longueur
echo ${#array[@]}
Boucle sur les éléments
for i in `seq $((${#array[@]}-1))`;do echo ${array[$i]};done
Arguments
Vérifier le nombre d'arguments
Dans un script bash, il arrive souvent que l'on veuille vérifier le nombre d'arguments. Le code suivant vérifie cela. De Check for number of arguments in bash.
# Check for proper number of command line args. EXPECTED_ARGS=1 E_BADARGS=65 if [ $# -ne $EXPECTED_ARGS ] then echo "Usage: `basename $0` {arg}" exit $E_BADARGS fi
Argument par défaut
Si y a pas d'argument donner en ligne de commande ($1), prendre la valeur de la variable:
INSPQ_CSV_URL="https://www.inspq.qc.ca/sites/default/files/covid/donnees/PL_DATE.csv" URL=${1:-$INSPQ_CSV_URL}
Répéter le même argument
Pour utiliser le même argument, nul besoin de l'écrire plusieurs fois:
commande argument_1 argument_1 argument_1
est la même chose que:
commande argument_1{,,}
Redirection dans un for loop
Essai-erreur :
for i in `seq 1 10`; do { R --vanilla --args input1 input2 output < code.r; }; done for i in `seq 1 10`; do { R --vanilla --args input1 input2 output; } < code.r; done for i in `seq 1 10`; do cat code.r | R --vanilla --args input1 input2 output; done
PS1
Trucs pour la couleur du prompt en bash. Librement inspiré de ArchWiki et de Customizing BASH command prompt.
Pour avoir le nom de la machine en couleur rouge:
export PS1='\[\e[31;1m\]\h>\[\033[0m\] '
de couleur jaune:
export PS1='\[\e[33;1m\]\h>\[\e[0m\] '
où
\[\e[ commence le schéma des couleur 33;1 paire de couleurs à utiliser (33 - foreground;1 - background) m\] termine le code de couleur? \h le nom du domaine jusqu'au premier '.' > caractère > \[\e[0m\] fin du schéma de couleur.
Le code de couleur est le suivant:
foreground colors: * 30 black * 31 red * 32 green * 33 brown * 34 blue * 35 purple * 36 light * 37 gray
background colors: * 40 black * 41 red * 42 green * 43 brown * 44 blue * 45 purple * 46 light blue * 47 white