@kamaris
kamaris a écritRq : pour récupérer plus simplement le nom de clé que tu utilises :
var=${usblongname##*/}
Je viens d'utiliser ton astuce pour définir la variable $VAR et ça fonctionne de façon impeccable : merci !!! 😛
6 jours plus tard
kamaris a écritJe ne sais pas si tu as vu, j'utilise un nom de clé pour le notify-send dans la fonction power_off() de mon script : c'est le champ MODEL de lsblk.
Bonjour kamaris,
Dans un petit script d'essai autour de ton travail, j'ai vainement essayé de définir une variable $model en partant de la ligne de script que tu as eu la gentillesse d'écrire (post #13).
J'ai notamment essayé :
model=$(lsblk -no model "$2" | tr '_' ' ')
mais, lorsque je l'introduis ensuite dans la ligne de commande de notify-send en écrivant :
model=$(lsblk -no model "$2")
notify-send "summary"  -t 10000 '$model'
, j'ai ce message d'erreur :
jlfh0816 @ Voyager1804  ~/.scripts
└─ $ ▶ ./essai.sh
lsblk:  : n'est pas un périphérique bloc
Est-ce que tu pourrais me dire comment définir $model de telle sorte que je puisse ensuite l'utilser dans la ligne de commande de notify-send ?
Ou alors faut-il impérativement définir $model à l'intérieur d'une fonction power off () comme tu l'as fait dans ton script ?
Ou alors est-ce lsblk qui ne peut être appelé comme je le fais ?

Je te remercie par avance de ton aide !
@jlfh0816

Dans ton script, la variable $2 n'est sans doute pas définie,
ce qui entraîne l’apparition du message d'erreur :
lsblk:  : n'est pas un périphérique bloc
Remplace $2 par exemple par : /dev/sda :
model=$(lsblk -no model /dev/sda)
notify-send "summary"  -t 10000 "$model"
Merci beaucoup MicP de ta réponse.
J'ai donc remplacé $2 par /dev/sdb mais ça ne supprime pas le message d'erreur relatif à lsblk :
jlfh0816 @ Voyager1804  ~/.scripts
└─ $ ▶ ./essai.sh
lsblk: /dev/sdb : n'est pas un périphérique bloc
Le message de notification qui s'affiche malgré tout montre que le body est constitué par l'expression littérale de $model :



Même résultat en mettant sdb1 au lieu de sdb.

Je suis retourné voir le script de kamaris et je ne vois pas trop à quel endroit $2 est définie ?

Autre chose : lorsque dans mon script j'ajoute un
echo $model
rien ne s'affiche dans le terminal ...
Il faut passer à lsblk un nom de périphérique valide.
Pour voir tes noms de périphériques, regarde le retour de lsblk dans le terminal (première colonne).

Dans mon script, le $2 (second argument) de la fonction power_off() correspond à $last_device dans le corps le script, car j'appelle la fonction par
power_off "$1" "$last_device"
$1 est le premier argument du script (l'option éventuelle -v), également passé en premier argument à power_off().

Ton corps de message contient littéralement $model au lieu de sa valeur, car tu as utilisé des guillemets simples au lieu des doubles :
notify-send "summary"  -t 10000 '$model'
au lieu de
notify-send "summary"  -t 10000 "$model"
@kamaris

Merci beaucoup de ta patience pour toutes ces explications ! 🙂

kamaris a écritIl faut passer à lsblk un nom de périphérique valide.
Pour voir tes noms de périphériques, regarde le retour de lsblk dans le terminal (première colonne).
C'est tout bon maintenant en précisant /dev/sdb dans mon petit script :
model=$(lsblk -no model /dev/sdb)
echo $model
notify-send "summary" -t 10000 "$model"
- l'echo me retourne bien Cruzer Blade (c'est le modèle de ma clef usb) :
jlfh0816 @ Voyager1804  ~/.scripts
└─ $ ▶ ./essai.sh
Cruzer Blade
- et le message de notification m'affiche bien également Cruzer Blade :



kamaris a écritTon corps de message contient littéralement $model au lieu de sa valeur, car tu as utilisé des guillemets simples au lieu des doubles
Oui, tu as tout à fait raison, j'aurai dû mieux vérifier ma syntaxe.
En fait, cette histoire de guillemets pour le corps du message n'est pas claire car j'ai remarqué (à plusieurs reprises) que, lorsqu'il n'y a pas variable, il lui arrive de ne s'afficher que s'il est entouré de guillemets simples. Par contre, effectivement, lorsque ce corps de message doit afficher la valeur d'une variable, il nécessite des guillemets doubles.
Difficile à comprendre ...

kamaris a écritDans mon script, le $2 (second argument) de la fonction power_off() correspond à $last_device dans le corps le script, car j'appelle la fonction par
power_off "$1" "$last_device"
$1 est le premier argument du script (l'option éventuelle -v), également passé en premier argument à power_off().
Alors là, pour le béotien que je suis, j'avoue ne pas avoir tout compris car si j'ai bien repéré $1 dans ton script ... il apparaît après l'utilisation de $2 (c'est normal ?).
Bon, j'ai largement de quoi potasser les manuels de bash script !!! 😛

Encore merci de ta patience kamaris ... et à toi aussi MicP !


edit: je viens de comprendre pour $2 avant $1 : en fait, c'est dans la déclaration de la fonction que j'avais cette impression car, dans le fil du script ensuite, $1 est bien avant $2.... désolé de ne pas avoir saisi tout de suite ! :rolleyes:
jlfh0816 a écritEn fait, cette histoire de guillemets pour le corps du message n'est pas claire car j'ai remarqué (à plusieurs reprises) que, lorsqu'il n'y a pas variable, il lui arrive de ne s'afficher que s'il est entouré de guillemets simples. Par contre, effectivement, lorsque ce corps de message doit afficher la valeur d'une variable, il nécessite des guillemets doubles.
Difficile à comprendre ...
En fait, quand on écrit une ligne de commande, il faut toujours penser qu'il y a deux étapes :
- l'interprétation de cette ligne de commande par le shell ;
- l'interprétation des arguments de cette ligne de commande par la commande concernée (ici notify-send).

Ce que reçoit la commande invoquée n'est donc pas ce qui est écrit, mais ce qui sort de l'interprétation de ce qui est écrit par le shell.
Voir la section « Simple Command Expansion » de man bash pour un exposé synthétique de cette interprétation.
Concernant les guillemets, le shell les retire (quote removal) en développant ou pas les variables qu'ils contiennent selon qu'il s'agit de guillemets doubles ou simples.
Un bon moyen de voir à quoi ressemble la commande effectivement lancée, est d'utiliser set -x (cf. help set).
jlfh0816 a écritedit: je viens de comprendre pour $2 avant $1 : en fait, c'est dans la déclaration de la fonction que j'avais cette impression car, dans le fil du script ensuite, $1 est bien avant $2.... désolé de ne pas avoir saisi tout de suite ! :rolleyes:
Rq : ces $1 et $2 sont à ne pas confondre avec les $1 et $2 dans
done < <(lsblk -Ppno kname,pkname,hotplug,mountpoint \
         | awk '{for (i=1;i<=NF;i++) gsub("[^\"]+=\"|\"","",$i)}
                (+$3 || p) && $4{print $1" "$2; p=0; next}
                +$3 && $2{p=1; next} {p=0}')
car là, ça désigne des champs dans awk, ce qui est encore autre chose ! 😃
@kamaris

Que dire devant tant de pédagogie, de patience et de bienveillance .... si ce n'est un grand merci ! 😃
Bon, dans la pratique, je prendrai quand même deux comprimés d'aspirine avant de me plonger dans les méandres des manuels de bash/shell : on n'est jamais assez prudent !
Et de toute façon, il faudra que je m'en trouve en français si possible, ce sera nettement plus constructif et agréable pour tenter de saisir toutes ces subtilités de syntaxe...