Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 02-06-2020 13:37:03

Croutons
Membre
Distrib. : Debian10 Buster
Noyau : Linux 4.19.0-9-amd64
(G)UI : Mate
Inscription : 16-12-2016

[resolu] comment tester le contenu d'une variable

Hello
Je me suis bidouillé un petit script qui est sûrement pas top mais fonctionnel
Dans mon script je test si ma variable stop est nul ou contient le caractère n , comme ceci

if      [ -z $stop ] || [ $stop = n ]


j'aurais aimé tester aussi si stop=N par exemple mais j'ai pas trouvé comment faire
j'ai lu pas mal de chose sur le wikiDF en autre qui disait qu'en bash on utilisait les accolades

{n,N}


J'ai donc testé pas mal de syntaxe mais j'obtiens toujours une erreur

Voici le script du débutant que je suis en entier
stop mon enregistrement ffmpeg

#!/bin/bash
#necessite l'installation du paquet at
#script stop_ffmpeg.sh = pkill ffmpeg

echo "arret de l'enregistrement"
read -p "Choix 1) compte à rebour(défaut)~~~~~ Choix 2) à l'Heure :
Votre choix ?: "
temps
read -p "Avec Arret du PC ?  n)NON(défaut)~~~~~o)Oui :" stop
export temps

if  [ -z $temps ] || [ $temps -eq 1 ] #tester en premier si la variable est non nul pour éviter un message d'erreur
then
  echo "Entrer la durée d'enregistrement
  le SUFFIXE peut être « s » pour secondes(par défaut), « m » pour minutes, « h » pour heures
  exemple:2h 30m 5s
  115m"

  read -p "stop l'enregistrement (ffmpeg) dans:" duree
  sleep $duree && ./stop_ffmpeg.sh
  echo "fin sleep arret record"
else
  read -p "Arret enregistrement à (format HH:MM) :" duree
  at $duree -f stop_ffmpeg.sh
fi
 
if      [ -z $stop ] || [ $stop = n ]
then
  echo "FIN d'enregistrement sans shutdown "

elif  [ -z $temps ] || [ $temps -eq 1 ] && [ $stop = o ]
then  
        sleep 6 && /sbin/shutdown
 
elif  [ $stop = o ]
then
  read -p "arret enregistrement prévu à $duree
  entrer l'heure d'arret du PC: "
stop2
  /sbin/shutdown $stop2
  echo "/sbin/shutdown -c pour annuler shutdown" ; sleep 20
fi
 

Dernière modification par Croutons (03-06-2020 08:30:46)


-->les cahiers du debutant<--      WikiDF-->Découvrir les principales commandes Linux<--
L' expérience, c'est le nom que chacun donne à ses erreurs. Oscar Wilde

Hors ligne

#2 02-06-2020 13:53:49

otyugh
CA Debian-Facile
Lieu : Quimperlé/Arzano
Distrib. : Debian Stable
Inscription : 20-09-2016
Site Web

Re : [resolu] comment tester le contenu d'une variable

Moi j'utiliserai tout bêtement grep.

echo "$stop" | grep -Eq "^[Nn]{0,1}$"


Ça match "n", "N", et "". Si tu enlèves le "1", ça match tout ce qui commence par n, N et chaine vide.

Mais sinon :

[[ "$stop" =~ ^[Nn]{0,1}$ ]]

Dernière modification par otyugh (02-06-2020 14:03:54)


datalove-datalove-s1-2.png agendadulibre-lagendadulibre.png arzinfo-arzinfo.png

En ligne

#3 02-06-2020 14:33:01

Cauryl
Membre
Distrib. : Debian Buster
(G)UI : Xfce
Inscription : 12-02-2020

Re : [resolu] comment tester le contenu d'une variable

Salut !

Ce que tu veux faire se fait avec des parenthèses :

if [[ -z $stop ]] || [[ $stop =~ (n|N) ]]; then
  echo true
fi
 

Dernière modification par Cauryl (02-06-2020 14:33:43)

Hors ligne

#4 02-06-2020 15:01:49

Croutons
Membre
Distrib. : Debian10 Buster
Noyau : Linux 4.19.0-9-amd64
(G)UI : Mate
Inscription : 16-12-2016

Re : [resolu] comment tester le contenu d'une variable

Ah merci , c'est encore plus flou pour moi lol
me reste beaucoup à  apprendre kernal_panic.gif
fonctionne au poil mais j'ai pas compris grand chose

-->les cahiers du debutant<--      WikiDF-->Découvrir les principales commandes Linux<--
L' expérience, c'est le nom que chacun donne à ses erreurs. Oscar Wilde

Hors ligne

#5 02-06-2020 16:18:30

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : [resolu] comment tester le contenu d'une variable

Pour information, la partie droite d'opérateur '=~'  doit être une regexp.

Exemple : Si la variable $stop contient une chaine vide (^$ en regexp) ou contient 'n' alors affiche 'true' :

if [[ $stop =~ ^($|n) ]]; then echo true; fi

Dernière modification par Beta-Pictoris (02-06-2020 16:19:36)

Hors ligne

#6 03-06-2020 01:00:53

MicP
Membre
Inscription : 29-02-2016

Re : [resolu] comment tester le contenu d'une variable

Bonjour

Dans son message #1, Croutons a écrit :

… j'aurais aimé tester aussi si stop=N  …

Alors :

[[ $stop =~ ^($|n|N) ]] && echo true


qui est équivalent à :

if [[ $stop =~ ^($|n|N) ]]; then
    echo true
fi


Dernière modification par MicP (03-06-2020 04:17:25)

Hors ligne

#7 03-06-2020 08:02:23

Croutons
Membre
Distrib. : Debian10 Buster
Noyau : Linux 4.19.0-9-amd64
(G)UI : Mate
Inscription : 16-12-2016

Re : [resolu] comment tester le contenu d'une variable

MicP a écrit :

Alors :
[[ $stop =~ ^($|n|N) ]] && echo true


Ah oui donc test si la variable stop est nul ou si le premier caractère est n ou N
fonctionne aussi si je tape nuit par exemple
J'avais essayé sans les pipes voir, cela fonctionne aussi test si la variable contient n ou N
mais en faite pas bon car

[[ $stop =~ ^($oO) ]] && echo true


si stop=non vu que la variable contient o je suis dans les choux tongue
j'aurais jamais trouvé tout seul pourtant j'en ai consulté des pages web, m'en vais de se pas modifier mon script
c'est tellement mieux de répondre non ,Non, niet,nada love.gif

#!/bin/bash
#necessite l'installation du paquet at
#script stop_ffmpeg.sh = pkill ffmpeg

zenity --warning --text="inhibé la veille automatique
quitter Redshift
luminosité au max"
--ok-label="J'ai compris" --width=250
echo "arret de l'enregistrement"
read -p "Choix 1) compte à rebour(défaut)~~~~~ Choix 2) à l'Heure :
Votre choix ?: "
temps
read -p "Avec Arret du PC ?  n)NON(défaut)~~~~~o)Oui :" stop
export temps

if  [ -z $temps ] || [ $temps -eq 1 ] #tester en premier si la variable est non nul pour éviter un message d'erreur
then
  echo "Entrer la durée d'enregistrement
  le SUFFIXE peut être « s » pour secondes(par défaut), « m » pour minutes, « h » pour heures
  exemple:2h 30m 5s
  115m"

  read -p "stop l'enregistrement (ffmpeg) dans:" duree
  sleep $duree && ./stop_ffmpeg.sh
  echo "fin sleep arret record"
else
  read -p "Arret enregistrement à (format HH:MM) :" duree
  at $duree -f stop_ffmpeg.sh
fi
 
if      [[ $stop =~ ^($|n|N) ]] #si la variable est nul $ commence par n ou N
then
  echo "FIN d'enregistrement sans shutdown "

elif  [ -z $temps ] || [ $temps -eq 1 ] && [[ $stop =~ ^(o|O) ]]
then  
        sleep 6 && /sbin/shutdown
 
elif  [[ $stop =~ ^(o|O) ]]
then
  read -p "arret enregistrement prévu à $duree
  entrer l'heure d'arret du PC: "
stop2
  /sbin/shutdown $stop2
  echo "/sbin/shutdown -c pour annuler shutdown" ;sleep 30
fi

Dernière modification par Croutons (03-06-2020 18:10:46)


-->les cahiers du debutant<--      WikiDF-->Découvrir les principales commandes Linux<--
L' expérience, c'est le nom que chacun donne à ses erreurs. Oscar Wilde

Hors ligne

#8 03-06-2020 09:14:40

MicP
Membre
Inscription : 29-02-2016

Re : [resolu] comment tester le contenu d'une variable

Dans mon précédent message, j'avais juste répondu à ce que tu avais demandé dans ton premier message.

Mais tu as changé le cahier de charges depuis ton premier message dans lequel tu avais écrit :

Dans son premier message, Croutons a écrit :

si ma variable stop est nul ou contient le caractère n

j'aurais aimé tester aussi si stop=N

Dernière modification par MicP (03-06-2020 09:16:50)

Hors ligne

#9 03-06-2020 09:56:29

Croutons
Membre
Distrib. : Debian10 Buster
Noyau : Linux 4.19.0-9-amd64
(G)UI : Mate
Inscription : 16-12-2016

Re : [resolu] comment tester le contenu d'une variable

eu non j'ai pas changer la demande , je faisais juste le constat que ta commande répondait aussi bien a tout contenu commençant par n ,N ou vide
mais c'est encore mieux car du coup on peux écrire en toute lettre si on veut
c'est + des commentaires pour mes archives en faite, comme ça si je relis le poste un peu plus tard je m'y retrouve mieux

[[ $stop =~ ^($|n|N) ]]

répond a tout ce qui commence par N,n ou vide

Dernière modification par Croutons (03-06-2020 18:05:38)


-->les cahiers du debutant<--      WikiDF-->Découvrir les principales commandes Linux<--
L' expérience, c'est le nom que chacun donne à ses erreurs. Oscar Wilde

Hors ligne

#10 03-06-2020 17:52:54

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : [resolu] comment tester le contenu d'une variable

Croutons a écrit :

[[ "$stop" =~ ^[Nn1]{0}$ ]]

est stricte et ne répond qu'à N,n ou vide


Ton expression ne marche que pour des chaines vides :

stop=""; [[ "$stop" =~ ^[Nn1]{0}$ ]] && echo Ok


Ok


Ce n'est pas mieux comme ceci ? :

stop="1" && [[ $stop =~ ^(|n|N|1)$ ]] && echo Ok


Ou comme cela :

stop="1" && [[ $stop =~ ^(|[1nN])$ ]] && echo Ok


smile
A noter, les doubles guillemets ne sont pas utiles entres les doubles crochets.

Dernière modification par Beta-Pictoris (03-06-2020 18:02:06)

Hors ligne

#11 03-06-2020 18:15:10

Croutons
Membre
Distrib. : Debian10 Buster
Noyau : Linux 4.19.0-9-amd64
(G)UI : Mate
Inscription : 16-12-2016

Re : [resolu] comment tester le contenu d'une variable

merci.gifvous êtes super

-->les cahiers du debutant<--      WikiDF-->Découvrir les principales commandes Linux<--
L' expérience, c'est le nom que chacun donne à ses erreurs. Oscar Wilde

Hors ligne

Pied de page des forums