Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#26 Le 20/12/2024, à 17:59

Watael

Re : (résolu) Vérifier qu'un paquet est installé ou pas : which, dpkg ?

  • l'indexation manuelle d'un tableau associatif indexé (à moins d'avoir des "trous") est inutile.

  • itmp est inutile.

  • imax est inutile.

  • seq est un programme externe inutile

    for ((i=0;i<${#File[*]}; i++))
  • les guillemets dans le case sont très facultatifs => inutiles. big_smile

par contre, il vaut mieux mettre des guillemets autour de

${File[i]}

, où d'ailleurs (l'indice d'un tableau associatif indexé étant forcément dans un contexte arithmétique), le $ est inutile.

Dernière modification par Watael (Le 21/12/2024, à 00:39)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#27 Le 21/12/2024, à 00:28

RaphaelG

Re : (résolu) Vérifier qu'un paquet est installé ou pas : which, dpkg ?

Watael a écrit :

...............
........ où d'ailleurs (l'index d'un tableau associatif étant forcément dans un contexte arithmétique), le $ est inutile.

C'est dingue ! Que tu mettes un $ ou pas, le résultat est le même.
C'est pour ça que je n'aime pas le bash.

J'ai suivi les précieuses recommandations de Watael et pour le fun (et la dernière fois, promis) je vous remets mon code :

#!/bin/bash

declare -ra File=( [0]=ghostscript [1]=ensscript [2]=unoconv [3]=ccrypt
[4]=convert [5]=pdfposter [6]=rename [7]=ffmpeg [8]=pdftk [9]=lame )
declare -ra App=( [0]=ghostscript [1]=ensscript [2]=unoconv [3]=ccrypt
[4]=imagekick [5]=pdfposter [6]=arename [7]=ffmpeg [8]=pdftk [9]=lame )
declare -ra appFormat=( [0]=d [1]=d [2]=d [3]=d [4]=d [5]=d [6]=d [7]=d [8]=s
[9]=d )  # d=Debian package, s=snap, f=flatpak, A=Appimage ...

for (( i=0; i<${#File[*]}; i++ ))
do
    if ! hash "${File[i]}" >/dev/null 2>&1
    then
        case ${appFormat[i]} in
            d ) echo "Please, install the Debian package ${App[i]}"
            ;;
            s ) echo "Please, install the snap ${App[i]}"
            ;;
        esac
    fi
done

C'est tout pour moi. Je vous remercie de m'avoir écouté.

Hors ligne

#28 Le 21/12/2024, à 00:38

Watael

Re : (résolu) Vérifier qu'un paquet est installé ou pas : which, dpkg ?

il manquait une

declare -ra File=( ghostscript ensscript unoconv ccrypt
convert pdfposter rename ffmpeg pdftk lame )

pareil pour les autres déclarations de tableau indexé.

pourquoi je précise ? parce qu'il existe des tableaux associatifs :

declare -A aAr=( [a]=A [b]=B [etc]='...' )

Dernière modification par Watael (Le 21/12/2024, à 00:40)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#29 Le 21/12/2024, à 13:09

RaphaelG

Re : (résolu) Vérifier qu'un paquet est installé ou pas : which, dpkg ?

Je reformule pour être sûr que j'ai bien compris;
Si je déclare mes 3 tableaux de cette manière :

declare -ra File=( ghostscript ensscript unoconv ccrypt convert pdfposter rename
ffmpeg pdftk lame )
declare -ra App=( ghostscript ensscript unoconv ccrypt imagekick pdfposter
arename ffmpeg pdftk lame )
declare -ra appFormat=( d d d d d d d d s d )

Mon script marche aussi bien que le précédent.
J'en conclus que les indices entre crochets ne sont pas obligatoires car implicites avec l'ordre dans lequel j'initialise le contenu des cases de mon tableau .
Ai je bien compris ?

Certes, cela allège considérablement les déclarations de tableaux (non associatifs) mais, si bash s'en sort très bien, la compréhension du pauvre humain que je suis s'en trouve un peu plus compliquée. Par exemple, pour voir à quel paquet la commande rename est associée, je suis obligé de compter la position où elle est dans le tableau File puis de faire la même chose dans le tableau App pour m'apercevoir qu'elle est apportée par le paquet non éponyme arename.
Finalement je préfère préciser les indices.
Il me semble qu'il ne peut pas avoir d'ambiguité avec les tableaux associatifs qui eux, obligent d'utiliser declare avec le commutateur -A.

Hors ligne

#30 Le 21/12/2024, à 17:44

Watael

Re : (résolu) Vérifier qu'un paquet est installé ou pas : which, dpkg ?

tu as bien compris.

les indices si ça t'es utile, pas de problème
mais pourquoi ne pas faire un tableau associatif :

#!/bin/bash

declare -A Progs=(
    [nomProgramme]='nomPaquet|format'
    [etc]='et|c'
)

for nomProg in "${!Progs[@]}"
do
    IFS='|' read -r nomPaquet format <<<"${Progs[$nomProg]}"
#etc
done

Dernière modification par Watael (Le 21/12/2024, à 17:45)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#31 Le 23/12/2024, à 15:17

RaphaelG

Re : (résolu) Vérifier qu'un paquet est installé ou pas : which, dpkg ?

J'ai essayé avec 1 seul tableau associatif tel que décrit par Watael.
Ca marche bien mais la ligne :
IFS='|' read -r nomPaquet format <<<"${Progs[$nomProg]}"
me donne un peu la migraine. Les différences entre les redirections "<", "<<" et "<<<" sont un peu subtiles pour moi.
Je l'aurais bien remplacée par ces 2 lignes :
nompaquet=$(echo "${Progs[$prog]}" | awk -F "|" '{print $1}')
format=$(echo "${Progs[$prog]}" | awk -F "|" '{print $2}')
Oui, c'est moins compact et ça utilise une commande externe donc le code de Watael est plus optimisé mais plus compliqué à appréhender de mon point de vue.

J'ai réfléchi et je me suis dit que 2 tableaux associatifs seraient plus simples à manipuler que le tableau de Watael qui simule un tableau à 2 dimensions.
Voilà ce que ça donne:

#!/bin/bash

declare -rA Apps=( [ghostscript]=ghostscript [ensscript]=ensscript
[unoconv]=unoconv [ccrypt]=ccrypt [convert]=imagekick [pdfposter]=pdfposter
[rename]=arename [ffmpeg]=ffmpeg [pdftk]=pdftk [lame]=lame )
declare -rA Format=( [ghostscript]=d [ensscript]=d [unoconv]=d [ccrypt]=d
[convert]=d [pdfposter]=d [rename]=d [ffmpeg]=d [pdftk]=s [lame]=d )

for cmd in "${!Apps[@]}"
do
    app=${Apps[cmd]}
    format=${Format[cmd]}
    if ! hash "$cmd" >/dev/null 2>&1
    then
        case $format in
            d ) echo "Please, install the Debian package $app"
            ;;
            s ) echo "Please, install the snap $app"
            ;;
        esac
    fi
done

Mais mon script préféré reste celui du post #27.

Je pense qu'on a fait un peu le tour de la question et que cristobal78 pourrait passer ce fil en résolu.
Joyeux noël à tous et encore tous mes remerciements à Watael pour ces précieux et pertinents conseils.

Hors ligne

#32 Le 23/12/2024, à 18:26

Watael

Re : (résolu) Vérifier qu'un paquet est installé ou pas : which, dpkg ?

d'abord, il y eut
<< c'est un here-doc (un document en ligne) qui permet d'écrire un bloc vers une commande.
c'est fréquemment utilisé avec cat :

cat <<eof >fichierDest
foo
bar
baz
eof

ceci redirige le bloc de texte vers cat, et on redirige la sortie standard de cette commande vers un fichier, qui finalement contiendra le loc de texte.

puis, apparut
<<< c'est un here-string  (un chaîne en ligne), qui permet d'écrire une chaîne vers un commande; c'est bien pratique pour éviter les pipes, ou quand ne peut pas en utiliser.

si ça t'embête vraiment :

nomPaquet=${Progs[$nomProg]%|*}
format=${Progs[$nomProg]#*|}

/!\ deux tableaux, c'est deux fois plus d'entretien, et une source d'erreurs superfétatoire.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#33 Hier à 15:31

RaphaelG

Re : (résolu) Vérifier qu'un paquet est installé ou pas : which, dpkg ?

Je connaissais le mécanisme "here doc" mais pas le "here string" (qui est un bashisme).
Je ne savais pas non plus comment supprimer une sous chaine au début ou à la fin d'une d'une chaîne contenue dans une variable. Au départ j'ai haussé les épaules  en me disant : encore un bashisme.
Mais non, ça marche aussi avec dash !
On en apprend tous les jours y compris pendant la trêve des confiseurs.

Hors ligne

#34 Hier à 16:33

cristobal78

Re : (résolu) Vérifier qu'un paquet est installé ou pas : which, dpkg ?

Merci à tous ceux qui ont nourri ce fil.  smile  smile  smile
Ma fonction au post #1 n'a pas été vraiment remise en cause.
Elle marche très bien pour assurer que sont bien présents et disponibles tous les paquets (pas les commandes !) nécessaires au bon déroulement du script.
Je la conserve en l'état d'autant que je la comprends parfaitement, ce qui ne serait pas forcément le cas d'autres propositions sans doute plus belles mais que je ne comprendrai peut-être plus dans un an ou deux !
Je passe en résolu et merci encore pour les idées toujours intéressantes qui ont fusées dans ce fil.


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne