Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

HS: petite question bash et variable en argument d'une commande

9 réponses
Avatar
Jérémy Prego
Bonjour,

Quelque chose que je pensais simple s'avère plus compliqué que prévu. Je
souhaite utiliser un argument de la commande date que je positionne en
variable. Cela me permet de pouvoir initialiser la variable ou non selon
le cas. sauf que ça fonctionne pas vraiment.

extrait de mon test:
#!/bin/bash
day_date="--date='1 days ago'"

date ${day_date} "+%A %d %B"

En gros, quand la variable est initialisé, ça m'affiche la date d'hier
au lieu de la date d'aujourd'hui. sauf que  ça ne fonctionne pas
vraiment, j'ai un peu tout essayé des exemples pris sur stackoverflow
avec ma variable sous forme de tableau, en testant avec eval, mais rien
Í  faire.

merci Í  vous pour le coup de main.

Jerem

9 réponses

Avatar
NoSpam
Bonjour
Le 22/03/2021 Í  07:46, Jérémy Prego a écrit :
Bonjour,
Quelque chose que je pensais simple s'avère plus compliqué que prévu. Je
souhaite utiliser un argument de la commande date que je positionne en
variable. Cela me permet de pouvoir initialiser la variable ou non selon
le cas. sauf que ça fonctionne pas vraiment.
extrait de mon test:
#!/bin/bash
day_date="--date='1 days ago'"

C'est day_date=`date --date='1 day ago'
date ${day_date} "+%A %d %B"
En gros, quand la variable est initialisé, ça m'affiche la date d'hier
au lieu de la date d'aujourd'hui. sauf que  ça ne fonctionne pas
vraiment, j'ai un peu tout essayé des exemples pris sur stackoverflow
avec ma variable sous forme de tableau, en testant avec eval, mais rien
Í  faire.

--
Daniel
Avatar
Marc Chantreux
hello,
extrait de mon test:
#!/bin/bash
au lieu de la date d'aujourd'hui. sauf que  ça ne fonctionne pas
vraiment, j'ai un peu tout essayé des exemples pris sur stackoverflow
day_date="--date='1 days ago'"

c'est parce que tu quote quote, ma poule.
day_date='--date=1 days ago'
date "$day_date" '+%A %d %B'
par contre naturellement j'aurais plus noté
date -d-1day '+%A %d %B'
a+
marc
Avatar
NoSpam
Le 22/03/2021 Í  09:14, NoSpam a écrit :
Bonjour
Le 22/03/2021 Í  07:46, Jérémy Prego a écrit :
Bonjour,
Quelque chose que je pensais simple s'avère plus compliqué que prévu. Je
souhaite utiliser un argument de la commande date que je positionne en
variable. Cela me permet de pouvoir initialiser la variable ou non selon
le cas. sauf que ça fonctionne pas vraiment.
extrait de mon test:
#!/bin/bash
day_date="--date='1 days ago'"

C'est day_date=`date --date='1 day ago'

Manque la backquote, désolé
day_date=`date --date='1 day ago'`
date ${day_date} "+%A %d %B"
En gros, quand la variable est initialisé, ça m'affiche la date d'hier
au lieu de la date d'aujourd'hui. sauf que  ça ne fonctionne pas
vraiment, j'ai un peu tout essayé des exemples pris sur stackoverflow
avec ma variable sous forme de tableau, en testant avec eval, mais rien
Í  faire.
Avatar
Marc Chantreux
> day_date="--date='1 days ago'"
C'est day_date=`date --date='1 day ago'
Manque la backquote, désolé

non mais même:
* je pige pas l'interet de préparer un argument de date en évaluant
une sortie de date
* en plus sous la forme ou tu l'écris c'est fragile parce que
# LANG= date -d-1day
Sun Mar 21 09:24:24 CET 2021
# date -d'Sun Mar 21 09:24:24 CET 2021'
dim. 21 mars 2021 09:24:24 CET
# date -d'dim. 21 mars 2021 09:24:24 CET'
date: date «Â dim. 21 mars 2021 09:24:24 CET » incorrecte
pour moi l'intention était de préparer l'argument
--date=1 day ago
qui peut se noter comme ceci
--date=1 day ago
--date='1 day ago'
'--date=1 day ago'
sauf que si je met des quotes dans les quotes
"--date='1 day ago'"
j'obtiens
--date='1 day ago'
belle journée
marc
Avatar
Jérémy Prego
Le 22/03/2021 Í  09:12, Marc Chantreux a écrit :
hello,
extrait de mon test:
#!/bin/bash
au lieu de la date d'aujourd'hui. sauf que  ça ne fonctionne pas
vraiment, j'ai un peu tout essayé des exemples pris sur stackoverflow
day_date="--date='1 days ago'"

c'est parce que tu quote quote, ma poule.

Merci pour cette affection ! :D
day_date='--date=1 days ago'
date "$day_date" '+%A %d %B'
par contre naturellement j'aurais plus noté
date -d-1day '+%A %d %B'

merci beaucoup pour le paramètre
-d-1day ça fonctionne parfaitement avec ce que je veux faire. si la variable est initialisé, il prends la veille sinon il prend le jour même.
a+
marc

Jerem
Avatar
Fabrice Bauzac-Stehly
Attention aux quotes:
#!/bin/bash
day_date="--date=1 day ago"
date "${day_date}" "+%A %d %B"
--
Fabrice Bauzac-Stehly
PGP 01EEACF8244E9C14B551C5256ADA5F189BD322B6
old PGP 015AE9B25DCB0511D200A75DE5674DEA514C891D
Avatar
l0f4r0
Bonjour,
Comme indiqué de manière très détaillée sur https://mywiki.wooledge.org/BashFAQ/050 (désolé c'est en anglais), stocker des commandes dans des variables est très hasardeux.
La façon la moins risquée est de passer par un tableau (d'ailleurs t'avais évoqué l'idée dans ton message initial).
Pour ton cas, ça donne donc :
date_args=( --date="1 days ago" )
date "${date_args[@]}" "+%A %d %B"
Bien cordialement,
l0f4r0
Avatar
Marc Chantreux
salut,
Comme indiqué de manière très détaillée sur https://mywiki.wooledge.org/BashFAQ/050

(désolé c'est en anglais), stocker des commandes dans des variables est très hasardeux.
je ne lit plus jamais qu'en diagonale toute litterature spécifique Í 
bash mais oui: les choses sont compliquées voir impossibles dans une
chaine. par contre ...
La façon la moins risquée est de passer par un tableau (d'ailleurs
t'avais évoqué l'idée dans ton message initial).

non! déjÍ : le seul tableau que posix connaisse est $@ donc
date_args=( --date="1 days ago" )
date "${date_args[@]}" "+%A %d %B"
nécessite au moins mksh pour être lu. et si tu utilises plus gros: je te
conseille de passer tout de suite du coté de zsh mais rien ne justifie
de sortir un veau comme bash dans le cas présent.
ensuite: la façon la moins risquée s'appelle une fonction et c'est même
fait pour. ca permet de surcroit de profiter
* de la localisation des variables dans le contexte de la fonction.
* du paramétrage d'une valeur par défaut
exemple:
mydate () date -d"${1:--1day}" '+%A %d %B'
mydate
mydate tomorrow
me donne
mercredi 24 mars
vendredi 26 mars
autre manière de faire pour éviter le quoting hell: xargs
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/xargs.html
date=tomorrow
# des trucs ...
<<. xargs -d'n' date
-d ${date:--1day}
+%A %d %B
.
xargs prend aussi un fichier, du coup tu peux composer ta commande
petit Í  petit
exec 9>/tmp/mydate
&9 echo "-d ${date:--1day}"
&9 echo '+%A %d %B'

exec 9>&-
xargs -a /tmp/mydate -d'n' date
hth
bonne journée
marc
Avatar
l0f4r0
Hello,
25 mars 2021, 09:02 de :
Comme indiqué de manière très détaillée sur https://mywiki.wooledge.org/BashFAQ/050

(désolé c'est en anglais), stocker des commandes dans des variables est très hasardeux.
je ne lit plus jamais qu'en diagonale toute litterature spécifique Í 
bash mais oui: les choses sont compliquées voir impossibles dans une
chaine. par contre ...
La façon la moins risquée est de passer par un tableau (d'ailleurs
t'avais évoqué l'idée dans ton message initial).

non!
[...]
ensuite: la façon la moins risquée s'appelle une fonction et c'est même
fait pour. ca permet de surcroit de profiter
* de la localisation des variables dans le contexte de la fonction.
* du paramétrage d'une valeur par défaut

Je parlais du cas o͹ l'on souhaiterait absolument passer par une variable. Vaut mieux le tableau que la chaͮne.
Nous sommes en phase sur la fonction.
autre manière de faire pour éviter le quoting hell: xargs
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/xargs.html
date=tomorrow
# des trucs ...
<<. xargs -d'n' date
-d ${date:--1day}
+%A %d %B
.
xargs prend aussi un fichier, du coup tu peux composer ta commande
petit Í  petit
exec 9>/tmp/mydate
&9 echo "-d ${date:--1day}"
&9 echo '+%A %d %B'
exec 9>&-
xargs -a /tmp/mydate -d'n' date

Merci, ça m'a fait réviser xargs et les redirections/descripteurs de fichiers non standards ;)
25 mars 2021, 19:14 de :
Pour info : tutorial bash
http://aral.iut-rodez.fr/fr/sanchis/enseignement/bash/

Oui, ce cours est vraiment top je trouve.
Je l'avais massivement utilisé Í  mes débuts en bash !
Bonne fin de journée
l0f4r0