Besoin d'aide - Script shell
Résolu
fabouf
Messages postés
1271
Date d'inscription
Statut
Membre
Dernière intervention
-
fabouf Messages postés 1271 Date d'inscription Statut Membre Dernière intervention -
fabouf Messages postés 1271 Date d'inscription Statut Membre Dernière intervention -
Bonjour, j'ai une question sur laquelle je bloque depuis quelques heures ...
Je dois écrire un script shell qui prend un paramètre, et grâce à l'historique des commandes il doit exécuter ce qui est dans cette ligne (chiffre passé en paramètre).
J'ai 2 soucis:
-impossible de créer l'historique ( la commande history fonctionne dans la console mais pas dans le script )
-j'arrive à afficher le résultat, mais comment faire pour que cela s'exécute?
J'ai écrit ceci:
#! bin/bash/
if [ $# -ne 1 ] || [ $1 -lt 1 ]
then
echo "erreur de paramètre"
else
history > essai.txt; # problème numero 1
grep "^ $1" essai.txt | cut -d\ -f4-99 |
fi
#fin
Merci d'avance,
Je dois écrire un script shell qui prend un paramètre, et grâce à l'historique des commandes il doit exécuter ce qui est dans cette ligne (chiffre passé en paramètre).
J'ai 2 soucis:
-impossible de créer l'historique ( la commande history fonctionne dans la console mais pas dans le script )
-j'arrive à afficher le résultat, mais comment faire pour que cela s'exécute?
J'ai écrit ceci:
#! bin/bash/
if [ $# -ne 1 ] || [ $1 -lt 1 ]
then
echo "erreur de paramètre"
else
history > essai.txt; # problème numero 1
grep "^ $1" essai.txt | cut -d\ -f4-99 |
fi
#fin
Merci d'avance,
A voir également:
- Besoin d'aide - Script shell
- Classic shell - Télécharger - Personnalisation
- Script vidéo youtube - Guide
- Mas script - Accueil - Windows
- Ghost script - Télécharger - Polices de caractères
- Script cmd - Guide
4 réponses
Bonjour,
Il ne faut pas utiliser #!/bin/bash retirez cette ligne car ça ouvre un nouveau shell avec un historique vide. Testez un .sh avec uniquement "history" dedans. src : http://unix.ittoolbox.com/groups/technical-functional/solaris-l/history-utility-in-bash-script-605752
Pour exécuter une commande qui est contenue dans une variable utilisez "eval"
exemple :
var="echo hello world"
eval $var
Pouvez aussi utiliser "history -w monfichier" pour enregistrer l'historique dans un fichier en particulier, ou utiliser "history -a" pour ajouter les dernières commandes utilisées dans l'historique en cours et le récupérer avec un "cat ~/.bash_history"
Il ne faut pas utiliser #!/bin/bash retirez cette ligne car ça ouvre un nouveau shell avec un historique vide. Testez un .sh avec uniquement "history" dedans. src : http://unix.ittoolbox.com/groups/technical-functional/solaris-l/history-utility-in-bash-script-605752
Pour exécuter une commande qui est contenue dans une variable utilisez "eval"
exemple :
var="echo hello world"
eval $var
Pouvez aussi utiliser "history -w monfichier" pour enregistrer l'historique dans un fichier en particulier, ou utiliser "history -a" pour ajouter les dernières commandes utilisées dans l'historique en cours et le récupérer avec un "cat ~/.bash_history"
J'y suis presque !
if [ $# -ne 1 ] || [ $1 -lt 1 ]
then
echo "erreur de paramètre"
else
history > histo
res=$(grep "^ $1" histo| cut -d\ -f3-999)
eval $res
fi
en enlevant la ligne du shebang j'arrive donc à avoir mon historique,
mais je n'arrive pas à exécuter cette variable resultat
( chmod ok, ./monscript.sh xxx ok, mais . monscript.sh xxx ne retourne rien )
if [ $# -ne 1 ] || [ $1 -lt 1 ]
then
echo "erreur de paramètre"
else
history > histo
res=$(grep "^ $1" histo| cut -d\ -f3-999)
eval $res
fi
en enlevant la ligne du shebang j'arrive donc à avoir mon historique,
mais je n'arrive pas à exécuter cette variable resultat
( chmod ok, ./monscript.sh xxx ok, mais . monscript.sh xxx ne retourne rien )
Salut,
et tu lances le script avec la commande (attention au . et ESPACE au début)
#!/bin/bash if [ $# -ne 1 ] || [ $1 -lt 1 ] then echo "erreur de paramètre" else history > histo res=$(grep "^ $1" histo| cut -d\ -f3-999) echo $res # pas besoin du eval, puisque $(commande) est stocké dans res fi
chmod +x script.sh
et tu lances le script avec la commande (attention au . et ESPACE au début)
. /chemin/vers/script.sh
Salut,
Ben si, si le but final est l'exécution de la commande,
Tu as raison ;-)
En ce cas il faudra peut être qu'il nous affiche ce que done la comamnde
De toute façon il n'a pas besoin de history > histo
On peut faire comme ça si je ne me trompe pas.
Mais j'aurais plutôt penser à !NUMERO_DE_COMMANDE qu'à eval ;-)
A voir comment on met ça dans le script
Ben si, si le but final est l'exécution de la commande,
Tu as raison ;-)
En ce cas il faudra peut être qu'il nous affiche ce que done la comamnde
De toute façon il n'a pas besoin de history > histo
On peut faire comme ça si je ne me trompe pas.
#!/bin/bash if [ $# -ne 1 ] || [ $1 -lt 1 ] then echo "erreur de paramètre" else history | grep "^ $1" | cut -d\ -f3-999 fi
Mais j'aurais plutôt penser à !NUMERO_DE_COMMANDE qu'à eval ;-)
A voir comment on met ça dans le script
#!/bin/bash if [ $# -ne 1 ] || [ $1 -lt 1 ] then echo "erreur de paramètre" else !$1 # fait un test pour ça, merci ;-) fi
Et bien ca ne retourne rien,
#!/bin/bash
if [ $# -ne 1 ] || [ $1 -lt 1 ]
then
echo "erreur de paramètre"
else
res=$(history | sed -n "s/^ *"$1" *\(.*\)/\1/p")
echo $res # pour voir si la variable a changé, sinon il faut utiliser eval
fi
fab@Glou:~/Documents$ ./exec.sh 459
fab@Glou:~$ ./Documents/exec.sh 987
résultat : rien :(
#!/bin/bash
if [ $# -ne 1 ] || [ $1 -lt 1 ]
then
echo "erreur de paramètre"
else
res=$(history | sed -n "s/^ *"$1" *\(.*\)/\1/p")
echo $res # pour voir si la variable a changé, sinon il faut utiliser eval
fi
fab@Glou:~/Documents$ ./exec.sh 459
fab@Glou:~$ ./Documents/exec.sh 987
résultat : rien :(
Re,
Tu ne lis pas les message https://forums.commentcamarche.net/forum/affich-21108781-besoin-d-aide-script-shell#3
Tu ne lis pas les message https://forums.commentcamarche.net/forum/affich-21108781-besoin-d-aide-script-shell#3
Il ne faut pas utiliser #!/bin/bash retirez cette ligne car ça ouvre un nouveau shell avec un historique vide.
Effectivement. Toutefois tu n'as pas lu le message jusqu'au bout.
If you wish to execute stmts in a file from
your current shell, then you will need to source it:
$ . yourfile
Ce qui veut dire que lorsqu'on utilise #!/bin/bash il faut lancer le script avec la commande
A lancer avec
et puis avec