Bash

De Octet.ca

Syntaxe Bash et autres commandes pratique.

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        :29 mars 2024
#
# 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

  1. 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\] '

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