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.

#1 Le 27/03/2010, à 02:33

_spk

[ScriptShell / Bash] Récupérer des colonnes de la sortie d'un 'cal'

Bonsoir à tous,

Nouvel utilisateur de linux, je débute dans le scripting bash (d'ailleurs je ne suis pas certain de poster au bon endroit ... ?).

J'ai besoin d'écrire un script qui quand je lui passe en paramètre un jour (en chiffre), un mois (idem), et une année (idem), me renvoie le jour en lettres relatifs aux arguments précédents.

Je pense utiliser la commande cal pour la récupération de ce jour, et je suis arrivé a peu près ici :
cal -nod -noc 1 2010 | awk '{ print $4 }'
Si le jour est en milieu de mois, la commande me renvoie bien la colonne mais si le mois commence un jour différent du lundi, par exemple un vendredi, le 1 est placé dans la première colonne alors qu'il est dans la cinquième, visuellement. Même chose pour la fin de mois.

Puis-je remédier à ce problème simplement ou existe-t-il un autre moyen d'arriver à mes fins ?
En vous remerciant d'avance & cordialement,

S.P

Dernière modification par _spk (Le 27/03/2010, à 02:33)

Hors ligne

#2 Le 27/03/2010, à 02:38

hardball

Re : [ScriptShell / Bash] Récupérer des colonnes de la sortie d'un 'cal'

hello

tu peux utiliser la commande date :

 date +%A -d"2010-03-01"

-- Toshiba satelliteA100-335 + Ubuntu Jaunty --
Pour les noobs : Bienvenue ! ici la perséverance vous récompense.
Pour les anciens : Merci à vous de partager votre savoir.
Et vive le perl !

Hors ligne

#3 Le 27/03/2010, à 02:41

nesthib

Re : [ScriptShell / Bash] Récupérer des colonnes de la sortie d'un 'cal'

pourquoi se compliquer la vie ? wink

date -d 2010-03-17 +%A

edit : grilled par hardball

Dernière modification par nesthib (Le 27/03/2010, à 02:41)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#4 Le 27/03/2010, à 04:42

AnsuzPeorth

Re : [ScriptShell / Bash] Récupérer des colonnes de la sortie d'un 'cal'

nesthib a écrit :

edit : grilled par hardball

Trop lent sur ce coup netshib ...
Faut dire aussi, 8 mn après la question, t'as prit ton temps roll

Qui a dit que ce forum n'était pas réactif, à 1h30 du mat, 10 mn après, on a sa réponse ....!


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#5 Le 27/03/2010, à 09:58

nesthib

Re : [ScriptShell / Bash] Récupérer des colonnes de la sortie d'un 'cal'

@AnsuzPeorth : lol

c'est vrai que dans l'ensemble la réactivité sur le forum est excellente


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#6 Le 27/03/2010, à 12:37

_spk

Re : [ScriptShell / Bash] Récupérer des colonnes de la sortie d'un 'cal'

Bonjour,

Il est vrai qu'en écrivant ce post hier à 1h20 je ne pensais pas avoir de réponses avant aujourd'hui. Je commence à aimer le monde Libre smile

Merci à tous pour ces réponses, mais j'ai oublié de parler de l'essentiel ; ceci est un sujet d'un petit TP de cours, et une des contraintes est l'utilisation de la commande cal pour récupérer le jour.
L'intervenant nous à surtout précisé de ne pas utiliser cette option de la commande date, trop facile. Ni la commande date tout court d'ailleurs x)

Avez-vous des idées ?
Merci !

Hors ligne

#7 Le 27/03/2010, à 12:58

credenhill

Re : [ScriptShell / Bash] Récupérer des colonnes de la sortie d'un 'cal'

hello
ce script affiche le jour en utilisant la commande cal
,/day jj mm aaaa

$ cat day
#!/bin/bash

cal $2 $3 |awk -v d=$1 'BEGIN{split("dimanche lundi mardi mercredi jeudi vendredi samedi",j)}
NR>2 {for(n=1;n<8;n++)if(substr($0,1+((n-1)*3),2)+0 == d){print j[n] ; exit}}'
$ 
$ ./day 27 3 2010
samedi
$ ./day 25 3 2010
jeudi 
$ ./day 14 7 1789
mardi
$

Hors ligne

#8 Le 27/03/2010, à 14:05

hardball

Re : [ScriptShell / Bash] Récupérer des colonnes de la sortie d'un 'cal'

challenge sympa !

voici mon code

#!/bin/bash

#  usage : ./cal.sh <jour> <mois> <annee>

# recuperation des arguments
j=$1
m=$2
a=$3

# initialisation de la liste des jours
jours=(dimanche lundi mardi mercredi jeudi vendredi samedi)

# quel est le jour du premier dimanche du mois ?
premierDimancheDuMois=`cal -m $m $a | grep " 1 " | awk '{print $NF}'`

# decalage et modulo pour obtenir l'indice de la liste
noJour=$(( ($j + 7 - $premierDimancheDuMois) % 7 ))


echo "le $j-$m-$a est tombe un ${jours[$noJour]}"

exit 0

-- Toshiba satelliteA100-335 + Ubuntu Jaunty --
Pour les noobs : Bienvenue ! ici la perséverance vous récompense.
Pour les anciens : Merci à vous de partager votre savoir.
Et vive le perl !

Hors ligne

#9 Le 27/03/2010, à 19:29

harusame17

Re : [ScriptShell / Bash] Récupérer des colonnes de la sortie d'un 'cal'

Mais qui est-ce _spk ? xD J'ai le même sujet de TP reçu a la même date xD

Merci bien de vos réponses, ça me donne des idées j'étais aussi un peu bloqué ^^

Hors ligne

#10 Le 27/03/2010, à 20:40

toto2006

Re : [ScriptShell / Bash] Récupérer des colonnes de la sortie d'un 'cal'

premierDimancheDuMois=`cal -m $m $a | grep " 1 "

@hardball ici le grep me semble pas très fiable ,
cela produira une erreur de syntaxe par exemple si grep renvois rien .
comme dans l'exemple ci dessous , le résultat n'est pas celui attendu c'est a dire samedi .
en plus tu ne testes pas les arguments , ni le retour de la commande cal !

./cal.sh 1 1 1
./cal.sh: line 17: (1 + 7 - 1
2) % 7 : « ) » manquante (error token is "2) % 7 ")
le 1-1-1 est tombe un dimanche

./cal.sh -11 1 1
./cal.sh: line 17: (-11 + 7 - 1
2) % 7 : « ) » manquante (error token is "2) % 7 ")
le -11-1-1 est tombe un dimanche

Voila une version qui me semble un peu plus fiable .

#!/bin/bash

TestVar(){
	# Test si Var est un entier > 0 && < 32
	
	var=$1
	[ $var -gt 0 ] 2> /dev/null
	VAL=$?
	[ $VAL -ne 0 -a $VAL -ne 1 ] && {
		echo "Erreur $1 n'est pas un entier "
		exit 1
	} ||  {
    
		[ $VAL -eq 1 ]  && {	 
			echo "Erreur $1 < 1 "
			exit 1
		}
	}
	
	[ $var -gt 31  ] &&  echo "Erreur saisie jour $1" && exit 1
}

# Recuperation arguments & tests 

[ $# -ne 3 ] && echo  "usage: $0 jour mois annee " && exit 1
j=$1 && TestVar $1

# Recuperation du calendrier ou sortie si erreur d'execution de la commande cal

val=$(cal $2 $3)
[ $? -ne 0 ] && exit 1

#recuperation du dernier jour du mois  & sortie si j > dj

tval=(  ${val[*]} )
T=${#tval[*]} 
((T--))
dj=${tval[$T]}  

[ $j -gt $dj  ] &&  echo "Erreur Pas $j ${tval[0]} en $3 " && exit 1

# affiche le calendrier & Calcul le decalage a partir du dimanche de la ligne 4 du calendrier
# si le 1er est un dimanche alors le dimanche de la ligne 4 est le 8 ieme jour du mois , le decalage est 0
# si le 1er est un mercredi   alors le dimanche de la ligne 4 est le 5 ieme jour du mois , le decalage est 3

echo -e "\n$val\n"

jour=( "Dimanche" "Lundi" "Mardi" "Mercredi" "Jeudi" "Vendredi" "Samedi" )
val=$(echo "$val"  |  sed -n '4p' |cut -d" " -f2)
((val=($j-val+7)%7))
echo -e "Le "$j" ${tval[0]} $3 est un "${jour[$val]}
 
./day.sh 11 1 1

     janvier 1      
di lu ma me je ve sa
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31               

Le 11 janvier 1 est un Mardi

Hors ligne

#11 Le 27/03/2010, à 21:39

himaxy

Re : [ScriptShell / Bash] Récupérer des colonnes de la sortie d'un 'cal'

Salut , salut

dit-donc les gars _spk et harusame , bande de petit tricheur , quoique l'intervenant le dirais lui même on a le droit de demander de l'aide nan ?

Merci pour votre aide , moi aussi sa me redonne des idées smile

Hors ligne

#12 Le 27/03/2010, à 22:42

hardball

Re : [ScriptShell / Bash] Récupérer des colonnes de la sortie d'un 'cal'

bien vu toto2006 pour le grep (il ne fonctionne pas non plus si dimanche tombe un premier)

je me suis épargné le check des variables car c'est pas le plus marrant wink

voici un remplacement de la commande avec le grep :

premierDimancheDuMois=`cal -m $m $a | perl -ne '3..print(/(\d)$/)'`

-- Toshiba satelliteA100-335 + Ubuntu Jaunty --
Pour les noobs : Bienvenue ! ici la perséverance vous récompense.
Pour les anciens : Merci à vous de partager votre savoir.
Et vive le perl !

Hors ligne

#13 Le 27/03/2010, à 23:46

toto2006

Re : [ScriptShell / Bash] Récupérer des colonnes de la sortie d'un 'cal'

je me suis épargné le check des variables car c'est pas le plus marrant wink

c'est vrai  c'est pas marrant smile mais bon ca évite des effets de bords et des bugs

sinon oui avec la commande perl y a plus les problèmes constatés avec le grep .

Hors ligne

#14 Le 27/03/2010, à 23:46

_spk

Re : [ScriptShell / Bash] Récupérer des colonnes de la sortie d'un 'cal'

Merci à vous, particulièrement toto2006 & hardball.
C'est nickel smile
Bonne continuation !

Hors ligne

#15 Le 04/04/2010, à 18:58

Ford Prefect

Re : [ScriptShell / Bash] Récupérer des colonnes de la sortie d'un 'cal'

Hello,

pour le bonheur de HardBall:

#! /bin/bash
cal $2 $3|perl -ne 'BEGIN{@d=("lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche")}/\b'$1'\b/g;print@d[int(pos()/3)]."\n"if(pos())'

Hors ligne

#16 Le 04/04/2010, à 19:19

Ford Prefect

Re : [ScriptShell / Bash] Récupérer des colonnes de la sortie d'un 'cal'

J'aurais dû réfléchir un peu plus...

#! /bin/bash
cal $2 $3|perl -ne '/\b'$1'\b/g;print(("lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche")[int(pos()/3)]."\n")if(pos())'

Hors ligne

#17 Le 05/04/2010, à 14:40

hardball

Re : [ScriptShell / Bash] Récupérer des colonnes de la sortie d'un 'cal'

bien vu pour l'emploi de pos() ford prefect

en continuant la chasse aux caractères :

cal -m $2 $3 | perl -ne '/\b'$1'\b/g&&print+(qw/lundi mardi mercredi jeudi vendredi samedi dimanche/)[int(pos()/3)],$/'

par contre ces codes ne fonctionnent pas tout le temps (cf toto2006)

cal 1 1 |perl -ne '/\b'1'\b/g;print(("lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche")[int(pos()/3)]."\n")if(pos())'

Dernière modification par hardball (Le 05/04/2010, à 15:03)


-- Toshiba satelliteA100-335 + Ubuntu Jaunty --
Pour les noobs : Bienvenue ! ici la perséverance vous récompense.
Pour les anciens : Merci à vous de partager votre savoir.
Et vive le perl !

Hors ligne

#18 Le 05/04/2010, à 14:59

hardball

Re : [ScriptShell / Bash] Récupérer des colonnes de la sortie d'un 'cal'

en voila un qui marche en l'an 1

#! /bin/bash
cal -m $2 $3 | perl -ne '3..{/(\d)$/,print+(qw/dimanche lundi mardi mercredi jeudi vendredi samedi/)[('$1'+7-$1)%7]}'

-- Toshiba satelliteA100-335 + Ubuntu Jaunty --
Pour les noobs : Bienvenue ! ici la perséverance vous récompense.
Pour les anciens : Merci à vous de partager votre savoir.
Et vive le perl !

Hors ligne