Posté(e) le 26 août 200816 a Bonjour j'ai un script Ksh que je doit convertir en Bash. je voudrais donc savoir la difference entre les deux types de shell merci
Posté(e) le 26 août 200816 a Auteur je veux l'equivalent de ces commandes en bash typeset -Z2 fmonth fday set -a mlength xx
Posté(e) le 26 août 200816 a Mon ami google m'a pointé des pages intéressantes comme http://www.faqs.org/faqs/unix-faq/shell/bash/ (C2) ou http://web.ift.uib.no/~btk/data/shell-100.BetaA.html Et effectivement, ta signature pique les yeux.
Posté(e) le 27 août 200816 a Auteur 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
Posté(e) le 27 août 200816 a Qu'est ce que tu as et qu'est ce que tu veux obtenir ? Un lien qui m'a bien servit : http://wooledge.org:8000/BashFAQ
Posté(e) le 27 août 200816 a 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")
Posté(e) le 28 août 200816 a 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')
Posté(e) le 28 août 200816 a Auteur merci pour votre aide le set -A n'est pas accepté ainsi que le typeset -Z
Posté(e) le 28 août 200816 a 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...
Posté(e) le 28 août 200816 a 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é.
Posté(e) le 29 août 200816 a 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
Posté(e) le 29 août 200816 a 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).
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.