Aller au contenu

conversion script ksh en bash


Messages recommandés

merci pour les url mais ça me sert pas beaucoup voila mon code

#! /bin/bash
#
# get current month and year
date '+%Y %m' | read year month
month=${month#0}   # drop leading zero

#
# back up one month
((month=month-1))
if ((!month)); then
   month=12
   ((year=year-1))
fi
echo $year $month

#
# compute last day of month
leap=0
if ((!(year%100))); then
   ((!(year%400))) && leap=1
else
   ((!(year%4))) && leap=1
fi
#				 ja fe ma ap ma jn jl ag se oc no de
set -a mlength xx 31 28 31 30 31 30 31 31 30 31 30 31
((leap)) && mlength[2]=29

last=${mlength[month]}

#
# loop
typeset -Z2 fmonth fday
day=1
while ((day<=last)); do
   fmonth=$month
   fday=$day
   h=lic${year}${fmonth}${fday}\*405\*.txt
   echo $h
   ((day=day+1))
done
exit 0

il faut que je change les lignes mlength et typeset

Lien vers le commentaire
Partager sur d’autres sites

Pourquoi faire soi-même des choses que date fait déjà bien?

#!/bin/sh

set -e

NOW='now'
[ "$1" ] && NOW="$1"

THISYEAR="$(date -d "$NOW" '+%Y')"
THISMONTH="$(date -d "$NOW" '+%m')"

LASTDATE="$THISYEAR-$THISMONTH-01 -1 day"
LASTYEAR="$(date -d "$LASTDATE" '+%Y')"
LASTMONTH="$(date -d "$LASTDATE" '+%m')"
LASTDAY="$(date -d "$LASTDATE" '+%d')"

for DAY in $(seq -w 1 $LASTDAY)
do
echo "$LASTYEAR-$LASTMONTH-$DAY"
done

(on peut s'amuser à changer "now" en mettant un paramètre au script pour tester, par exemple "2008-01-01")

Lien vers le commentaire
Partager sur d’autres sites

Pourquoi faire soi-même des choses que date fait déjà bien?

#!/bin/sh

set -e

NOW='now'
[ "$1" ] && NOW="$1"

THISYEAR="$(date -d "$NOW" '+%Y')"
THISMONTH="$(date -d "$NOW" '+%m')"

LASTDATE="$THISYEAR-$THISMONTH-01 -1 day"
LASTYEAR="$(date -d "$LASTDATE" '+%Y')"
LASTMONTH="$(date -d "$LASTDATE" '+%m')"
LASTDAY="$(date -d "$LASTDATE" '+%d')"

for DAY in $(seq -w 1 $LASTDAY)
do
echo "$LASTYEAR-$LASTMONTH-$DAY"
done

(on peut s'amuser à changer "now" en mettant un paramètre au script pour tester, par exemple "2008-01-01")

Une raison:

- absolument pas POSIX, ne tourne que sur GNU/Linux ou peut-être un BSD (seq/date -d/#!/bin/sh alors que la syntaxe $(...) non compatible bourne shell est utilisée).

Sinon Harold, il y a une erreur dans ton script ksh:

set -a mlength xx 31 28 31 30 31 30 31 31 30 31 30 31

devrait être

set -A mlength xx 31 28 31 30 31 30 31 31 30 31 30 31
.

Il te faut trouver un autre moyen de remplir le tableau mlenght, car set -A ne fonctionne pas en bash.

Autre chose, read ne fonctionne pas de la même façon en ksh et en bash.

Il faut remplacer:

date '+%Y %m' | read year month

par

year=$(date '+%Y')

month=$(date '+%m')

Lien vers le commentaire
Partager sur d’autres sites

Une raison:

- absolument pas POSIX, ne tourne que sur GNU/Linux ou peut-être un BSD (seq/date -d/#!/bin/sh alors que la syntaxe $(...) non compatible bourne shell est utilisée).

D'après l'IEEE Std 1003.1, paragraphe "Command Substitution", $(command) est parfaitement valide (ça marche même dans ksh).

De plus, on veut ici convertir de ksh vers bash, donc je ne vois pas vraiment le problème...

Lien vers le commentaire
Partager sur d’autres sites

Une raison:

- absolument pas POSIX, ne tourne que sur GNU/Linux ou peut-être un BSD (seq/date -d/#!/bin/sh alors que la syntaxe $(...) non compatible bourne shell est utilisée).

D'après l'IEEE Std 1003.1, paragraphe "Command Substitution", $(command) est parfaitement valide (ça marche même dans ksh).

De plus, on veut ici convertir de ksh vers bash, donc je ne vois pas vraiment le problème...

C'est posix, mais pas forcément compatible bourne shell, j'ai quelques serveurs ou ça ne fonctionne pas. Ce n'est donc pas portable.

Et si c'est du bash, il faut dans l'idéal mettre #!/usr/bin/env bash pour une plus grande portabilité.

Lien vers le commentaire
Partager sur d’autres sites

D'après wikibooks.org [1], la syntaxe $(...) est aussi disponible en bourne shell.

Ils disent quand même que certains shells ne la supportent pas, mais bon, ça doit être vraiment très très vieux et je doute que ça soit vraiment le contexte ici.

Le truc c'est que $(...) marche avec n'importe quel shell POSIX, c'est dommage d'appeller explicitement bash alors que n'importe quel shell POSIX marche.

Un shell où $(...) n'est pas authorisé, ça veut dire qu'il n'est pas POSIX, si ça n'est pas le cas, où est la syntaxe authorisée? En gros ça revient un peu à lancer un script dans un environnement inconnu, et c'est pas comme si personnellement j'avais un seul système comme ça pour tester.

[1] http://en.wikibooks.org/wiki/Bourne_Shell_...ng/Substitution

Lien vers le commentaire
Partager sur d’autres sites

sh n'est pas un shell Posix.

# cat /etc/release
				   Solaris 10 8/07 s10s_u4wos_12b SPARC
	   Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
					Use is subject to license terms.
						Assembled 16 August 2007
# echo $0
sh
# ls $(pwd)
syntax error: `(' unexpected

Solaris 10 update 4.

Par contre ça passe en HP-UX 11.11, je viens de tester et dans tous les AIX (sous AIX, /bin/sh et en fait korn shell).

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...