Sysop.Fr
Catégories

apache

awk

bash

charmap

date

echo

encoding

find

grep

hexdump

irc

iso3166

ls

mysql

od

openssh

printf

python

read

sed

seq

smpp

sort/uniq

tar

tr

ucp

Articles

Mémo de la commande read

La commande read permet de lire des données de l'entrée standard.

            !!! ATTENTION à la commande read lorsque qu'elle est utilisée avec un pipe | dans un script !!!
            echo -e $lines | while read line 
                ...
            done

            La boucle ci-dessus sera executée dans un subshell. Donc tous les changements éffectués sur des variables ne seront pas conservés lors de la sortie du subshell.
            Lire la page bash - boucles (while, for) pour lire la solution.
            

1. Options de la commande read

-aLes mots sont affectés à des indices séquentiels de la variable tableau aname, commençant à 0
-n ncharsla commande read s'arrêtera après avoir lu nchars caractères plutôt que d'attendre la ligne complète de l'entrée standard
-p promptla commande read affichera l'invite en cas d'erreur standard, sans un saut de ligne, avant de tenter de lire n'importe quelle entrée
-r(raw) si vous appuyez sur quelque chose comme anti-slash, il n'enregistre pas jusqu'à ce que vous appuyez sur la touche suivante
-s(silent) la commande read n'affichera pas le contenu saisi

2. Utiliser 'appuyer sur une touche pour continuer' dans un script shell

root@ubuntu:~# read -n1 -r -p "Press any key to continue..." key
            

3. Script shell intéractif

root@ubuntu:~# read -r -p "Quel est votre nom ? " name
Quel est votre nom ? Alexandre
root@ubuntu:~# echo $name
Alexandre
            
#!/bin/bash
while true; do
    read -r -p "Please confirm? [Y/n] " user_input
    case $user_input in
        [yY][eE][sS]|[yY]) echo "Yes"; break;;
        [nN][oO]|[nN]) echo "No"; exit 1;;
        *) echo "Invalid input..."; continue;;
    esac
done
echo "I'm here"
            

4. Exemple d'utilisation avec une chaîne de caractères

#!/bin/bash
myString="Ceci est une série de mots"
read -r -a mots <<< "$myString"
echo "Le premier mot de myString est   :   ${mots[0]}"   # Ceci
echo "Le deuxième mot de myString est  :   ${mots[1]}"   # est
echo "Le troisième mot de myString est :   ${mots[2]}"   # une
echo "Le quatrième mot de myString est :   ${mots[3]}"   # série
echo "Le cinquième mot de myString est :   ${mots[4]}"   # de
echo "Le sixième mot de myString est   :   ${mots[5]}"   # mots
echo "Le septième mot de myString est  :   ${mots[6]}"   # (null)
            

5. Exemples d'utilisation de résultat de commande

#!/bin/bash
while read -r user shell; do
    echo "user=${user} and shell=${shell}"
done <<< "$(awk -F":" '{print $1,$7}' /etc/passwd)"
            
#!/bin/bash
while read -r line; do
    echo "line=${line}"
done <<< "$(grep -E "(^${mypattern},|,${mypattern}$)" /tmp/mydatatfile.txt)"
            
#!/bin/bash
while read -r myfile; do
    echo "myfile=${myfile}"
    cp -pv ${myfile} ${myfile}.$(date +"%Y%m%d%H%M")
    sed -i -e "s/timeout = 15000/timeout = 30000/" ${myfile}
done <<< "$( grep -l "timeout = 15000" /tmp/*.txt )"
            

6. Exemples d'utilisation d'un fichier externe

#!/bin/bash
### convert space separated values into csv
while IFS= read -r i_line; do
    #echo ${i_line}
    IFS=' ' read -r -a i_array <<< "${i_line}"
    csv_string=$( printf "%s;" "${i_array[@]}" )    ### join array to string with space separator
    csv_string=${csv_string%?}                      ### remove last space from string
    echo ${csv_string} >${csv_file}
done < ${input_file}
            
#!/bin/bash
unset csv_array
while IFS=';' read -r -a csv_array; do
    local l_customername=${csv_array[0]}
    local l_customerid=${csv_array[1]}
    local l_liveaccount=${csv_array[2]}
    local l_customeraddress=${csv_array[3]}

    local l_args_array=("${l_liveaccount}" "${l_customerid}")
    ma_super_fonction "${l_args_array[@]}" ||return 1
done <<< "$( grep -E "^[A-Z0-9_]{1,};[0-9]{3,5};[0-1]{1};[A-Za-z0-9+][A-Za-z0-9 /:._-]*$" ${mon_fichier_csv} )"