Besoin d'aide - Script shell

Résolu/Fermé
fabouf Messages postés 1267 Date d'inscription samedi 20 octobre 2007 Statut Membre Dernière intervention 24 décembre 2015 - 7 mars 2011 à 18:35
fabouf Messages postés 1267 Date d'inscription samedi 20 octobre 2007 Statut Membre Dernière intervention 24 décembre 2015 - 8 mars 2011 à 21:50
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,
A voir également:

4 réponses

Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
7 mars 2011 à 22:30
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"
0
fabouf Messages postés 1267 Date d'inscription samedi 20 octobre 2007 Statut Membre Dernière intervention 24 décembre 2015 271
7 mars 2011 à 23:11
merci ! je replonge dedans dès demain et je vous tiens au courant.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
Modifié par lami20j le 8/03/2011 à 12:54
Salut,

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
. script.sh  


lami20j@debian-acer:~$ cat hist.sh   
#!/bin/bash  
history  
lami20j@debian-acer:~$ chmod -v +x hist.sh   
le mode de « hist.sh » a été modifié en 0755 (rwxr-xr-x). 


A lancer avec
./hist.sh

et puis avec
. hist.sh
0
fabouf Messages postés 1267 Date d'inscription samedi 20 octobre 2007 Statut Membre Dernière intervention 24 décembre 2015 271
8 mars 2011 à 10:32
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 )
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
8 mars 2011 à 12:28
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
8 mars 2011 à 12:31
Salut,

#!/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
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
8 mars 2011 à 13:01
Salut,

# pas besoin du eval, puisque $(commande) est stocké dans res
Ben si, si le but final est l'exécution de la commande, du moins c'est comme ça que je l'ai compris ;-\
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
Modifié par lami20j le 8/03/2011 à 13:09
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.



#!/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 
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
8 mars 2011 à 13:13
Re-

J'avais déjà testé ça hier soir et ça ne marchait pas ;-((

Pour preuve au cas ou...

$ vi foo.sh

$ chmod u+x foo.sh

$ ./foo.sh 118
./foo.sh: line 7: !118 : commande introuvable

$ . /home/zipe/tmpfs/foo.sh 118
-bash: !118 : commande introuvable

$
0
fabouf Messages postés 1267 Date d'inscription samedi 20 octobre 2007 Statut Membre Dernière intervention 24 décembre 2015 271
8 mars 2011 à 20:58
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 :(
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
8 mars 2011 à 21:11
0
fabouf Messages postés 1267 Date d'inscription samedi 20 octobre 2007 Statut Membre Dernière intervention 24 décembre 2015 271
8 mars 2011 à 21:13
si si ! j'y mets tout mon coeur , mais ca marche pas

fab@Glou:~/Documents$ chmod 777 exec.sh
fab@Glou:~/Documents$ ./exec.sh
erreur de paramètre
fab@Glou:~/Documents$ ./exec.sh 456

fab@Glou:~/Documents$ . exec.sh 456
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
8 mars 2011 à 21:17
Affiche le résultat de
history | grep 456
0
fabouf Messages postés 1267 Date d'inscription samedi 20 octobre 2007 Statut Membre Dernière intervention 24 décembre 2015 271
8 mars 2011 à 21:23
le soucis doit venir du grep,

avec ceci j'obtiens les lignes qui contiennent ce que j'ai passé en paramètre,

res=$( history | grep $1 | cut -d\ -f2-99)
echo $res

mais ce que je veux c'est garder la ligne qui commence par ce numero ...
0
fabouf Messages postés 1267 Date d'inscription samedi 20 octobre 2007 Statut Membre Dernière intervention 24 décembre 2015 271
8 mars 2011 à 21:25
avec grep "^ $1" ca fonctionne, ... maintenant c'est le cut qui doit m'enlever le premier champs
0
fabouf Messages postés 1267 Date d'inscription samedi 20 octobre 2007 Statut Membre Dernière intervention 24 décembre 2015 271
8 mars 2011 à 21:29
if [ $# -ne 1 ] || [ $1 -lt 1 ]
then
echo "erreur de paramètre"
else

res=$( history | grep "^ $1" | cut -d\ -f3-99)
eval $res
fi

ca fonctionne ! j'ai eus du mal à m'en rendre compte, car certaines lignes de mon historique ne renvoyait rien,

Merci à tous pour votre aide.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
8 mars 2011 à 21:31
Ok, tant mieux.
Tu peux mettre résolu alors ;-)
0