Bash : des choses que je ne savais pas...


19 mai 2011

On en découvre tous les jours sur Bash, surtout si on l'a appris en fonction de ses besoins et pas globalement.

Ainsi, on va rediriger la sortie d'un find vers une boucle while et utiliser des pseudos-classes :

#!/bin/bash
# This bash script will locate and replace spaces in the filenames
DIR="."
# Controlling a loop with bash read command by redirecting STDOUT as a STDIN to while loop
# find will not truncate filenames containing spaces
find $DIR -type f | while read file; do
    # using POSIX class [:space:] to find space in the filename
    if [[ "$file" = *[[:space:]]* ]]; then
        # substitute space with "_" character and consequently rename the file
        mv "$file" `echo $file | tr ' ' '_'`
    fi;
done

Le mot-clé select existe en Bash :

select word in "linux" "bash" "scripting" "tutorial" 
do
  echo "The word you have selected is: $word"
  break     # Break, otherwise endless loop
done

Les expensions ANSI-C :

# as a example we have used \n as a new line, \x40 is hex value for @
# and \56 is octal value for .
echo $'web: www.linuxconfig.org\nemail: web\x40linuxconfig\56org'

Les redirections...

X>&Y : redirige le flux de X vers le flux Y
X> : redirige le flux X (par défaut stdout ou 1) vers un fichier
On peut combiner les redirections précédentes, par exemple : > file 2>&1
Les deux indicateurs de redirections sont équivalents : >& et &>, tous les deux redirigent stdout et stderr vers un fichier
< : remplace stdin avec le contenu d'un fichier
<X : remplace le flux X avec le contenu d'un fichier

Si on utilise ces opérations de redirections avec la commande "exec" on exécute la redirection pour toute la durée du processus courant ou jusqu'à une modification de cette redirection et plus seulement dans le contexte d'une commande donnée. Donner des exemples.

# Link filedescriptor 10 with stdin
# stdin replaced with a file
Exemple : exec 10<&0; exec < Fichier
Son opposé (pour restaurer) : exec 0<&10 10<&-

On va utiliser 'exec < Fichier' pour pouvoir, par exemple, faire un 'while read Line' et énumérer toutes les lignes du fichier Fichier.

Question : est-ce que 'cat Fichier | command' est équivalent à 'command < Fichier' ?

Les expressions et leurs calculs
let Var=Expression : permet le calcul de Expression et le placement de son résultat dans Var
On peut "expandre" (calculer le résultat d'une expression) avec $((Expression)) ou $[ Expression ]
On peut écrire Base#Valeur pour déclarer la base dans laquelle s'exprime la valeur

Accueil