Débutant sous Bash, j'ai un problème avec un script dont le but est
d'archiver des fichiers logs.
Par exemple "./archives.sh apache" fonctionnera comme ceci :
J'ai pensé que je pouvais procèder par ordre décroissant (penser à
copier d'abord apache.n en apache.n+1 ... jusqu'a apache vers apache.1)
en utilisant un ls -1vr :
---
#!/bin/sh
modele=$1
for fichier in `ls -1vr $modele[0-9]*`
do
mv $modele.[0-9] $modele.[0-9] + 1 }
done
Comme vous pouvez le voir je suis complètement perdu sur la structure et
la syntaxe à adopter. L'idée est de pouvoir jouer avec la valeur
numérique placée après le modele pour l'incrémenter de 1 et de créer
cette valeur si elle nexiste pas (apache => apache.1).
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Stephane Chazelas
2003/10/25, 17:30(+00), MrBuG:
Débutant sous Bash, j'ai un problème avec un script dont le but est d'archiver des fichiers logs. Par exemple "./archives.sh apache" fonctionnera comme ceci :
J'ai pensé que je pouvais procèder par ordre décroissant (penser à copier d'abord apache.n en apache.n+1 ... jusqu'a apache vers apache.1) en utilisant un ls -1vr :
Bonne idée.
#!/bin/sh modele=$1
for fichier in `ls -1vr $modele[0-9]*`
Note que les "patterns" de sh ne sont pas des regexps. "$modele"[0-9]*, ça veut dire "$modele" suivi d'un chiffre suivi d'un nombre quelquonque de caractères.
Si les noms des fichiers ne contiennent pas de sauts de lignes tu peux faire avec n'importe quel shell POSIX et le GNU ls:
modele=apache ls -vr -- "$modele"* 2> /dev/null| while IFS= read -r fichier; do case $fichier in "$modele") mv -i -- "$fichier" "$fichier".1||break;; "$modele"[!.]|"$modele".|"$modele".*[!0-9]*) continue;; *) mv -i -- "$fichier" "${fichier%.*}.$((${fichier##*.}+1))"||break;; esac done
Avec perl, tu peux faire (doit y avoir plus simple):
Débutant sous Bash, j'ai un problème avec un script dont le but est
d'archiver des fichiers logs.
Par exemple "./archives.sh apache" fonctionnera comme ceci :
J'ai pensé que je pouvais procèder par ordre décroissant (penser à
copier d'abord apache.n en apache.n+1 ... jusqu'a apache vers apache.1)
en utilisant un ls -1vr :
Bonne idée.
#!/bin/sh
modele=$1
for fichier in `ls -1vr $modele[0-9]*`
Note que les "patterns" de sh ne sont pas des regexps.
"$modele"[0-9]*, ça veut dire "$modele" suivi d'un chiffre suivi
d'un nombre quelquonque de caractères.
Si les noms des fichiers ne contiennent pas de sauts de lignes
tu peux faire avec n'importe quel shell POSIX et le GNU ls:
modele=apache
ls -vr -- "$modele"* 2> /dev/null| while IFS= read -r fichier; do
case $fichier in
"$modele") mv -i -- "$fichier" "$fichier".1||break;;
"$modele"[!.]|"$modele".|"$modele".*[!0-9]*) continue;;
*) mv -i -- "$fichier" "${fichier%.*}.$((${fichier##*.}+1))"||break;;
esac
done
Avec perl, tu peux faire (doit y avoir plus simple):
Débutant sous Bash, j'ai un problème avec un script dont le but est d'archiver des fichiers logs. Par exemple "./archives.sh apache" fonctionnera comme ceci :
J'ai pensé que je pouvais procèder par ordre décroissant (penser à copier d'abord apache.n en apache.n+1 ... jusqu'a apache vers apache.1) en utilisant un ls -1vr :
Bonne idée.
#!/bin/sh modele=$1
for fichier in `ls -1vr $modele[0-9]*`
Note que les "patterns" de sh ne sont pas des regexps. "$modele"[0-9]*, ça veut dire "$modele" suivi d'un chiffre suivi d'un nombre quelquonque de caractères.
Si les noms des fichiers ne contiennent pas de sauts de lignes tu peux faire avec n'importe quel shell POSIX et le GNU ls:
modele=apache ls -vr -- "$modele"* 2> /dev/null| while IFS= read -r fichier; do case $fichier in "$modele") mv -i -- "$fichier" "$fichier".1||break;; "$modele"[!.]|"$modele".|"$modele".*[!0-9]*) continue;; *) mv -i -- "$fichier" "${fichier%.*}.$((${fichier##*.}+1))"||break;; esac done
Avec perl, tu peux faire (doit y avoir plus simple):
Débutant sous Bash, j'ai un problème avec un script dont le but est d'archiver des fichiers logs. Par exemple "./archives.sh apache" fonctionnera comme ceci :
J'ai pensé que je pouvais procèder par ordre décroissant (penser à copier d'abord apache.n en apache.n+1 ... jusqu'a apache vers apache.1) en utilisant un ls -1vr :
--- #!/bin/sh modele=$1
for fichier in `ls -1vr $modele[0-9]*` do mv $modele.[0-9] $modele.[0-9] + 1 }
done
Comme vous pouvez le voir je suis complètement perdu sur la structure et la syntaxe à adopter. L'idée est de pouvoir jouer avec la valeur numérique placée après le modele pour l'incrémenter de 1 et de créer cette valeur si elle nexiste pas (apache => apache.1).
Si tu ne doit pas impérativement écrire toi même ce programme, regarde plutôt du coté de programmes comme `logrotate' pour faire ce genre de chose... ça t'évitera de devoir recoder la gestion des fichiers ouverts, redemarrage de service, etc.
Un problème dans ton « script », par exemple, est que si le fichier apache est ouvert par httpd, alors le processus httpd continuera a écrire dans le fichier apache.1 aprés le `mv apache apache.1' et le fichier apache ne sera recrée qu'au prochain demarrage du service httpd...
man logrotate
On Sat, 25 Oct 2003 17:30:12 +0000, MrBuG wrote:
Bonjour à tous,
Débutant sous Bash, j'ai un problème avec un script dont le but est
d'archiver des fichiers logs.
Par exemple "./archives.sh apache" fonctionnera comme ceci :
J'ai pensé que je pouvais procèder par ordre décroissant (penser à
copier d'abord apache.n en apache.n+1 ... jusqu'a apache vers apache.1)
en utilisant un ls -1vr :
---
#!/bin/sh
modele=$1
for fichier in `ls -1vr $modele[0-9]*`
do
mv $modele.[0-9] $modele.[0-9] + 1 }
done
Comme vous pouvez le voir je suis complètement perdu sur la structure et
la syntaxe à adopter. L'idée est de pouvoir jouer avec la valeur
numérique placée après le modele pour l'incrémenter de 1 et de créer
cette valeur si elle nexiste pas (apache => apache.1).
Si tu ne doit pas impérativement écrire toi même ce programme, regarde
plutôt du coté de programmes comme `logrotate' pour faire ce genre de
chose... ça t'évitera de devoir recoder la gestion des fichiers ouverts,
redemarrage de service, etc.
Un problème dans ton « script », par exemple, est que si le fichier
apache est ouvert par httpd, alors le processus httpd continuera a écrire
dans le fichier apache.1 aprés le `mv apache apache.1' et le fichier
apache ne sera recrée qu'au prochain demarrage du service httpd...
Débutant sous Bash, j'ai un problème avec un script dont le but est d'archiver des fichiers logs. Par exemple "./archives.sh apache" fonctionnera comme ceci :
J'ai pensé que je pouvais procèder par ordre décroissant (penser à copier d'abord apache.n en apache.n+1 ... jusqu'a apache vers apache.1) en utilisant un ls -1vr :
--- #!/bin/sh modele=$1
for fichier in `ls -1vr $modele[0-9]*` do mv $modele.[0-9] $modele.[0-9] + 1 }
done
Comme vous pouvez le voir je suis complètement perdu sur la structure et la syntaxe à adopter. L'idée est de pouvoir jouer avec la valeur numérique placée après le modele pour l'incrémenter de 1 et de créer cette valeur si elle nexiste pas (apache => apache.1).
Si tu ne doit pas impérativement écrire toi même ce programme, regarde plutôt du coté de programmes comme `logrotate' pour faire ce genre de chose... ça t'évitera de devoir recoder la gestion des fichiers ouverts, redemarrage de service, etc.
Un problème dans ton « script », par exemple, est que si le fichier apache est ouvert par httpd, alors le processus httpd continuera a écrire dans le fichier apache.1 aprés le `mv apache apache.1' et le fichier apache ne sera recrée qu'au prochain demarrage du service httpd...
man logrotate
MrBuG
no a ecrit dans news::
On Sat, 25 Oct 2003 17:30:12 +0000, MrBuG wrote:
Bonjour à tous,
Débutant sous Bash, j'ai un problème avec un script dont le but est d'archiver des fichiers logs.
.../...
Si tu ne doit pas impérativement écrire toi même ce programme, regarde plutôt du coté de programmes comme `logrotate' pour faire ce genre de chose... ça t'évitera de devoir recoder la gestion des fichiers ouverts, redemarrage de service, etc.
Oui logrotate ou savelog j'y avais pensé, mais malheureusement je dois écrire moi même le script dans le cadres d'un TP. J'ai écris l'algo mais il ya quelques points assez confus concernant l'écriture en bash du $nomdufichier + $numero = $nomdufichier + ($numero + 1).
Cordialement, -- Mr. Bug
no <sp@m.net> a ecrit dans news:pan.2003.10.25.20.38.46.178429@m.net:
On Sat, 25 Oct 2003 17:30:12 +0000, MrBuG wrote:
Bonjour à tous,
Débutant sous Bash, j'ai un problème avec un script dont le but est
d'archiver des fichiers logs.
.../...
Si tu ne doit pas impérativement écrire toi même ce programme, regarde
plutôt du coté de programmes comme `logrotate' pour faire ce genre de
chose... ça t'évitera de devoir recoder la gestion des fichiers
ouverts, redemarrage de service, etc.
Oui logrotate ou savelog j'y avais pensé, mais malheureusement je dois
écrire moi même le script dans le cadres d'un TP. J'ai écris l'algo mais
il ya quelques points assez confus concernant l'écriture en bash du
$nomdufichier + $numero = $nomdufichier + ($numero + 1).
Débutant sous Bash, j'ai un problème avec un script dont le but est d'archiver des fichiers logs.
.../...
Si tu ne doit pas impérativement écrire toi même ce programme, regarde plutôt du coté de programmes comme `logrotate' pour faire ce genre de chose... ça t'évitera de devoir recoder la gestion des fichiers ouverts, redemarrage de service, etc.
Oui logrotate ou savelog j'y avais pensé, mais malheureusement je dois écrire moi même le script dans le cadres d'un TP. J'ai écris l'algo mais il ya quelques points assez confus concernant l'écriture en bash du $nomdufichier + $numero = $nomdufichier + ($numero + 1).
Cordialement, -- Mr. Bug
Stephane Chazelas
2003/10/26, 11:12(+00), MrBuG: [...]
Oui logrotate ou savelog j'y avais pensé, mais malheureusement je dois écrire moi même le script dans le cadres d'un TP. J'ai écris l'algo mais il ya quelques points assez confus concernant l'écriture en bash du $nomdufichier + $numero = $nomdufichier + ($numero + 1).
Si tu as:
var="apache.1"
tu obtiens le numéro avec
numero=${var##*.}
L'arithmetique, c'est avec $(( ... )).
numero=$(($numero + 1))
Alternativement avec bash (mais ces syntaxes ne sont pas POSIX), tu peux faire:
numero=$((numero+1)) (( numero++ )) let numero++
Tout ça est dans la page de man/info de bash.
Avec un shell Bourne, pour extraire le numero:
numero=`expr "x$var" : '.*.(.*)'` et pour incrémenter: numero=`expr "$numero" + 1`
Pour ton TP, une solution spécifique bash pourrait etre:
die() { printf >&2 "$@";exit 1; } f=() m=0 for i in "$modele"?(.+([0-9])); do (( n = ${i##"$modele"?(.)} + 1 )) [[ -n ${f[n]} ]] && die '"%s" et "%s" se verraient donner le meme nom ("%s").n' "$i" "${f[n]}" "$modele.$n" f[n]=$i (( n > m && (m = n) )) done
for (( n = m; n > 0; n-- )); do i=${f[n]} if [[ -n $i ]]; then mv -- "$i" "$modele.$n" || die '%sn' "erreur lors du renommage d'un fichier, arretons les frais" fi done
Mais il vaut mieux éviter d'écrire des scripts non POSIX compliant (surtout quand on les fait débuter par "#!/bin/sh").
Une manière de l'écrire très portable (à la fois Bourne et POSIX compliant) pourrait etre:
#! /bin/sh case $#:$1 in 1:[!-]*) ;; *) echo >&2 "Usage: $0 <modele>" exit 1;; esac f=" " modele=$1 for fichier in "$modele"* do case $fichier in "$modele") n=1;; "$modele"[!.]*|"$modele".|"$modele".*[!0-9]*) continue;; *) n=`expr "x$fichier" : '.*.(.*)' + 1`;; esac case $f in *" $n "*) eval 'echo >&2 ""$fichier" et "$f'"$n"'""' se verraient attribuer le meme nom '"("$modele.$n")."' exit 1;; esac f="$f$n " eval "f$n=$fichier" done for n in `echo $f | tr ' ' '12' | sort -rn` do eval "f=$f$n" echo "Renomage de "$f" en "$modele.$n"" mv "$f" "$modele.$n" && continue echo >&2 "Erreur lors du renommage d'un fichier, arretons les frais" exit 1 done
Oui logrotate ou savelog j'y avais pensé, mais malheureusement je dois
écrire moi même le script dans le cadres d'un TP. J'ai écris l'algo mais
il ya quelques points assez confus concernant l'écriture en bash du
$nomdufichier + $numero = $nomdufichier + ($numero + 1).
Si tu as:
var="apache.1"
tu obtiens le numéro avec
numero=${var##*.}
L'arithmetique, c'est avec $(( ... )).
numero=$(($numero + 1))
Alternativement avec bash (mais ces syntaxes ne sont pas POSIX),
tu peux faire:
numero=$((numero+1))
(( numero++ ))
let numero++
Tout ça est dans la page de man/info de bash.
Avec un shell Bourne, pour extraire le numero:
numero=`expr "x$var" : '.*.(.*)'`
et pour incrémenter:
numero=`expr "$numero" + 1`
Pour ton TP, une solution spécifique bash pourrait etre:
die() { printf >&2 "$@";exit 1; }
f=() m=0
for i in "$modele"?(.+([0-9])); do
(( n = ${i##"$modele"?(.)} + 1 ))
[[ -n ${f[n]} ]] && die
'"%s" et "%s" se verraient donner le meme nom ("%s").n'
"$i" "${f[n]}" "$modele.$n"
f[n]=$i
(( n > m && (m = n) ))
done
for (( n = m; n > 0; n-- )); do
i=${f[n]}
if [[ -n $i ]]; then
mv -- "$i" "$modele.$n" ||
die '%sn' "erreur lors du renommage d'un fichier, arretons les frais"
fi
done
Mais il vaut mieux éviter d'écrire des scripts non POSIX
compliant (surtout quand on les fait débuter par "#!/bin/sh").
Une manière de l'écrire très portable (à la fois Bourne et POSIX
compliant) pourrait etre:
#! /bin/sh
case $#:$1 in
1:[!-]*) ;;
*) echo >&2 "Usage: $0 <modele>"
exit 1;;
esac
f=" " modele=$1
for fichier in "$modele"*
do
case $fichier in
"$modele") n=1;;
"$modele"[!.]*|"$modele".|"$modele".*[!0-9]*) continue;;
*) n=`expr "x$fichier" : '.*.(.*)' + 1`;;
esac
case $f in
*" $n "*)
eval 'echo >&2 ""$fichier" et "$f'"$n"'""' se
verraient attribuer le meme nom '"("$modele.$n")."'
exit 1;;
esac
f="$f$n "
eval "f$n=$fichier"
done
for n in `echo $f | tr ' ' '12' | sort -rn`
do
eval "f=$f$n"
echo "Renomage de "$f" en "$modele.$n""
mv "$f" "$modele.$n" && continue
echo >&2 "Erreur lors du renommage d'un fichier, arretons les frais"
exit 1
done
Oui logrotate ou savelog j'y avais pensé, mais malheureusement je dois écrire moi même le script dans le cadres d'un TP. J'ai écris l'algo mais il ya quelques points assez confus concernant l'écriture en bash du $nomdufichier + $numero = $nomdufichier + ($numero + 1).
Si tu as:
var="apache.1"
tu obtiens le numéro avec
numero=${var##*.}
L'arithmetique, c'est avec $(( ... )).
numero=$(($numero + 1))
Alternativement avec bash (mais ces syntaxes ne sont pas POSIX), tu peux faire:
numero=$((numero+1)) (( numero++ )) let numero++
Tout ça est dans la page de man/info de bash.
Avec un shell Bourne, pour extraire le numero:
numero=`expr "x$var" : '.*.(.*)'` et pour incrémenter: numero=`expr "$numero" + 1`
Pour ton TP, une solution spécifique bash pourrait etre:
die() { printf >&2 "$@";exit 1; } f=() m=0 for i in "$modele"?(.+([0-9])); do (( n = ${i##"$modele"?(.)} + 1 )) [[ -n ${f[n]} ]] && die '"%s" et "%s" se verraient donner le meme nom ("%s").n' "$i" "${f[n]}" "$modele.$n" f[n]=$i (( n > m && (m = n) )) done
for (( n = m; n > 0; n-- )); do i=${f[n]} if [[ -n $i ]]; then mv -- "$i" "$modele.$n" || die '%sn' "erreur lors du renommage d'un fichier, arretons les frais" fi done
Mais il vaut mieux éviter d'écrire des scripts non POSIX compliant (surtout quand on les fait débuter par "#!/bin/sh").
Une manière de l'écrire très portable (à la fois Bourne et POSIX compliant) pourrait etre:
#! /bin/sh case $#:$1 in 1:[!-]*) ;; *) echo >&2 "Usage: $0 <modele>" exit 1;; esac f=" " modele=$1 for fichier in "$modele"* do case $fichier in "$modele") n=1;; "$modele"[!.]*|"$modele".|"$modele".*[!0-9]*) continue;; *) n=`expr "x$fichier" : '.*.(.*)' + 1`;; esac case $f in *" $n "*) eval 'echo >&2 ""$fichier" et "$f'"$n"'""' se verraient attribuer le meme nom '"("$modele.$n")."' exit 1;; esac f="$f$n " eval "f$n=$fichier" done for n in `echo $f | tr ' ' '12' | sort -rn` do eval "f=$f$n" echo "Renomage de "$f" en "$modele.$n"" mv "$f" "$modele.$n" && continue echo >&2 "Erreur lors du renommage d'un fichier, arretons les frais" exit 1 done
Pour ton TP, une solution spécifique bash pourrait etre:
#! /usr/bin/bash
c'est sur quel OS ? j'ai pas de /usr/bin/bash
[...]
Mais il vaut mieux éviter d'écrire des scripts non POSIX compliant (surtout quand on les fait débuter par "#!/bin/sh").
Une manière de l'écrire très portable (à la fois Bourne et POSIX compliant) pourrait etre:
#! /bin/sh case $#:$1 in 1:[!-]*) ;;
j'arrive pas à comprendre le [!-]* c'est bien tous les caractères ne contenant pas "-" répétés n fois ? Quel en est l'intérêt le but ?
*) echo >&2 "Usage: $0 <modele>" exit 1;; esac f=" " modele=$1 for fichier in "$modele"* do case $fichier in "$modele") n=1;; "$modele"[!.]*|"$modele".|"$modele".*[!0-9]*) continue;; *) n=`expr "x$fichier" : '.*.(.*)' + 1`;; esac case $f in *" $n "*) eval 'echo >&2 ""$fichier" et "$f'"$n"'""' se verraient attribuer le meme nom '"("$modele.$n")."' exit 1;; esac f="$f$n " eval "f$n=$fichier" done for n in `echo $f | tr ' ' '12' | sort -rn` do eval "f=$f$n" echo "Renomage de "$f" en "$modele.$n"" mv "$f" "$modele.$n" && continue echo >&2 "Erreur lors du renommage d'un fichier, arretons les frais" exit 1 done
-- William.
Pour ton TP, une solution spécifique bash pourrait etre:
#! /usr/bin/bash
c'est sur quel OS ?
j'ai pas de /usr/bin/bash
[...]
Mais il vaut mieux éviter d'écrire des scripts non POSIX compliant
(surtout quand on les fait débuter par "#!/bin/sh").
Une manière de l'écrire très portable (à la fois Bourne et POSIX
compliant) pourrait etre:
#! /bin/sh
case $#:$1 in
1:[!-]*) ;;
j'arrive pas à comprendre le [!-]* c'est bien tous les caractères
ne contenant pas "-" répétés n fois ?
Quel en est l'intérêt le but ?
*) echo >&2 "Usage: $0 <modele>"
exit 1;;
esac
f=" "
modele=$1
for fichier in "$modele"*
do
case $fichier in
"$modele") n=1;;
"$modele"[!.]*|"$modele".|"$modele".*[!0-9]*) continue;; *) n=`expr
"x$fichier" : '.*.(.*)' + 1`;;
esac
case $f in
*" $n "*)
eval 'echo >&2 ""$fichier" et "$f'"$n"'""' se
verraient attribuer le meme nom '"("$modele.$n")."'
exit 1;;
esac
f="$f$n "
eval "f$n=$fichier"
done
for n in `echo $f | tr ' ' '12' | sort -rn` do
eval "f=$f$n"
echo "Renomage de "$f" en "$modele.$n"" mv "$f" "$modele.$n" &&
continue
echo >&2 "Erreur lors du renommage d'un fichier, arretons les frais"
exit 1
done
Pour ton TP, une solution spécifique bash pourrait etre:
#! /usr/bin/bash
c'est sur quel OS ? j'ai pas de /usr/bin/bash
[...]
Mais il vaut mieux éviter d'écrire des scripts non POSIX compliant (surtout quand on les fait débuter par "#!/bin/sh").
Une manière de l'écrire très portable (à la fois Bourne et POSIX compliant) pourrait etre:
#! /bin/sh case $#:$1 in 1:[!-]*) ;;
j'arrive pas à comprendre le [!-]* c'est bien tous les caractères ne contenant pas "-" répétés n fois ? Quel en est l'intérêt le but ?
*) echo >&2 "Usage: $0 <modele>" exit 1;; esac f=" " modele=$1 for fichier in "$modele"* do case $fichier in "$modele") n=1;; "$modele"[!.]*|"$modele".|"$modele".*[!0-9]*) continue;; *) n=`expr "x$fichier" : '.*.(.*)' + 1`;; esac case $f in *" $n "*) eval 'echo >&2 ""$fichier" et "$f'"$n"'""' se verraient attribuer le meme nom '"("$modele.$n")."' exit 1;; esac f="$f$n " eval "f$n=$fichier" done for n in `echo $f | tr ' ' '12' | sort -rn` do eval "f=$f$n" echo "Renomage de "$f" en "$modele.$n"" mv "$f" "$modele.$n" && continue echo >&2 "Erreur lors du renommage d'un fichier, arretons les frais" exit 1 done
-- William.
Stephane Chazelas
2003/10/26, 21:53(+01), William:
Pour ton TP, une solution spécifique bash pourrait etre:
#! /usr/bin/bash
c'est sur quel OS ? j'ai pas de /usr/bin/bash
J'ai toujours vu bash là sous Linux, il doit etre aussi souvent dans /bin vu que pas mal de distributions de Linux ne connaissent pas d'autres sh que bash. J'imagine qu'on le trouve là aussi dans /usr/bin sur les autres systèmes où il est installé de base (MacOSX, *BSD... mais je ne suis pas allé vérifier).
Sinon, sur la plupart des Unix, il n'y a pas de bash par défaut, s'il y est, il aura été installé explicitement, on pourra le trouver alors dans /usr/local/bin, /opt/gnu/bin, que sais-je encore.
[...]
#! /bin/sh case $#:$1 in 1:[!-]*) ;;
j'arrive pas à comprendre le [!-]* c'est bien tous les caractères ne contenant pas "-" répétés n fois ?
Non, ça vérifie que $1 ne commence pas par "-".
Quel en est l'intérêt le but ?
Déjà, ça permet de renvoyer un message d'aide si on passe "-h" ou "--help", Ensuite ça évite des ennuis dans « mv "$modele" ... ».
Pour ton TP, une solution spécifique bash pourrait etre:
#! /usr/bin/bash
c'est sur quel OS ?
j'ai pas de /usr/bin/bash
J'ai toujours vu bash là sous Linux, il doit etre aussi souvent
dans /bin vu que pas mal de distributions de Linux ne
connaissent pas d'autres sh que bash. J'imagine qu'on le trouve
là aussi dans /usr/bin sur les autres systèmes où il est
installé de base (MacOSX, *BSD... mais je ne suis pas allé
vérifier).
Sinon, sur la plupart des Unix, il n'y a pas de bash par défaut,
s'il y est, il aura été installé explicitement, on pourra le
trouver alors dans /usr/local/bin, /opt/gnu/bin, que sais-je
encore.
[...]
#! /bin/sh
case $#:$1 in
1:[!-]*) ;;
j'arrive pas à comprendre le [!-]* c'est bien tous les caractères
ne contenant pas "-" répétés n fois ?
Non, ça vérifie que $1 ne commence pas par "-".
Quel en est l'intérêt le but ?
Déjà, ça permet de renvoyer un message d'aide si on passe "-h"
ou "--help", Ensuite ça évite des ennuis dans
« mv "$modele" ... ».
Pour ton TP, une solution spécifique bash pourrait etre:
#! /usr/bin/bash
c'est sur quel OS ? j'ai pas de /usr/bin/bash
J'ai toujours vu bash là sous Linux, il doit etre aussi souvent dans /bin vu que pas mal de distributions de Linux ne connaissent pas d'autres sh que bash. J'imagine qu'on le trouve là aussi dans /usr/bin sur les autres systèmes où il est installé de base (MacOSX, *BSD... mais je ne suis pas allé vérifier).
Sinon, sur la plupart des Unix, il n'y a pas de bash par défaut, s'il y est, il aura été installé explicitement, on pourra le trouver alors dans /usr/local/bin, /opt/gnu/bin, que sais-je encore.
[...]
#! /bin/sh case $#:$1 in 1:[!-]*) ;;
j'arrive pas à comprendre le [!-]* c'est bien tous les caractères ne contenant pas "-" répétés n fois ?
Non, ça vérifie que $1 ne commence pas par "-".
Quel en est l'intérêt le but ?
Déjà, ça permet de renvoyer un message d'aide si on passe "-h" ou "--help", Ensuite ça évite des ennuis dans « mv "$modele" ... ».
On Sun, 26 Oct 2003 23:13:28 +0100, Stephane Chazelas wrote:
J'ai toujours vu bash là sous Linux, il doit etre aussi souvent dans /bin vu que pas mal de distributions de Linux ne connaissent pas d'autres sh que bash.
J'imagine qu'on le trouve là aussi dans /usr/bin sur les autres systèmes où il est installé de base (MacOSX, *BSD... mais je ne suis pas allé vérifier).
Sinon, sur la plupart des Unix, il n'y a pas de bash par défaut, s'il y est, il aura été installé explicitement, on pourra le trouver alors dans /usr/local/bin, /opt/gnu/bin, que sais-je encore.
si bash ne doit pas sur /bin, c'est souvent dans /usr/local/bin qu'on le trouve
Quel en est l'intérêt le but ? Déjà, ça permet de renvoyer un message d'aide si on passe "-h" ou
"--help", Ensuite ça évite des ennuis dans « mv "$modele" ... ».
Amé oui ! Merci -- William.
On Sun, 26 Oct 2003 23:13:28 +0100, Stephane Chazelas wrote:
J'ai toujours vu bash là sous Linux, il doit etre aussi souvent dans
/bin vu que pas mal de distributions de Linux ne connaissent pas
d'autres sh que bash.
J'imagine qu'on le trouve là aussi dans /usr/bin
sur les autres systèmes où il est installé de base (MacOSX, *BSD... mais
je ne suis pas allé vérifier).
Sinon, sur la plupart des Unix, il n'y a pas de bash par défaut, s'il y
est, il aura été installé explicitement, on pourra le trouver alors dans
/usr/local/bin, /opt/gnu/bin, que sais-je encore.
si bash ne doit pas sur /bin, c'est souvent dans /usr/local/bin qu'on le
trouve
Quel en est l'intérêt le but ?
Déjà, ça permet de renvoyer un message d'aide si on passe "-h" ou
"--help", Ensuite ça évite des ennuis dans « mv "$modele" ... ».
On Sun, 26 Oct 2003 23:13:28 +0100, Stephane Chazelas wrote:
J'ai toujours vu bash là sous Linux, il doit etre aussi souvent dans /bin vu que pas mal de distributions de Linux ne connaissent pas d'autres sh que bash.
J'imagine qu'on le trouve là aussi dans /usr/bin sur les autres systèmes où il est installé de base (MacOSX, *BSD... mais je ne suis pas allé vérifier).
Sinon, sur la plupart des Unix, il n'y a pas de bash par défaut, s'il y est, il aura été installé explicitement, on pourra le trouver alors dans /usr/local/bin, /opt/gnu/bin, que sais-je encore.
si bash ne doit pas sur /bin, c'est souvent dans /usr/local/bin qu'on le trouve
Quel en est l'intérêt le but ? Déjà, ça permet de renvoyer un message d'aide si on passe "-h" ou
"--help", Ensuite ça évite des ennuis dans « mv "$modele" ... ».