web-dev-qa-db-fra.com

Puis-je utiliser ECHO pour exécuter des commandes?

J'ai mis au point un script génial qui produira la sortie dont j'ai besoin, mais il ne s'affiche qu'à l'écran. Je dois donc copier, puis coller les commandes pour les exécuter. Voici la version abrégée de mon script:

#!/bin/bash
runc=/etc/csf/csf.pl -d
for IP in `tail -400 iptext.txt`
do
cc=`geoiplookup $IP`
echo -e $runc $IP    $cc | grep Algeria
echo -e $runc $IP    $cc | grep Argentina
echo -e $runc $IP    $cc | grep Armenia
echo -e $runc $IP    $cc | grep Azerbaijan
echo -e $runc $IP    $cc | grep Bolivia
echo -e $runc $IP    $cc | grep Brazil
done

Ok, donc il parcourt la liste d'adresses IP dans iptext.txt, puis effectue une recherche géoIP sur chacune d'elles, si (dans cet exemple), il y a deux correspondances geoIP dans la liste, disons pour l'Arménie et le Brésil, je verrai la sortie comme ceci dans la fenêtre Shell:

/etc/csf/csf.pl -d 46.162.242.17 GeoIP Country Edition: AM, Armenia
/etc/csf/csf.pl -d 200.147.38.50 GeoIP Country Edition: BR, Brazil

C’est formidable, mais je veux plus que la sortie, je veux en fait que la commande /etc/csf/csf.pl -d soit exécutée et bloque (juste et uniquement) l’adresse IP dans les lignes correspondant au nom du pays, dans la liste.

J'ai essayé diverses choses avec ma connaissance limitée des scripts Shell, mais jusqu'à présent, rien ne semble fonctionner. Donc, y at-il une option pour ECHO qui me manque qui exécuterait réellement la commande plutôt que d’imprimer la ligne?

15
jols

Un moyen simple, qui ne nécessite aucune modification de votre script, serait de diriger la sortie de la commande vers une autre instance de bash. Comme ça:

yourscript | bash -

Le - indique à bash qu'il doit lire les commandes à partir de stdin.


Toutefois, si vous ne recherchez pas une solution rapide, il est également possible de créer et d'exécuter la commande de manière dynamique. Comme ça:

cmd="ls"
if [ "foo" != "bar" ] ; then
    cmd="$cmd -a"
then

# ... and so on

# now execute it:
$cmd
14
hek2mgl

Vous pouvez utiliser eval pour exécuter une chaîne:

eval $cmdstring
9
Syntax

Il suffit de mettre votre commande entre parenthèses comme ceci:

echo $(ls)

Vous pouvez aussi avoir du texte avant la commande

echo "The date is $(date)"

Par exemple

echo "Enter Text Here $(Command Here)"
7
Neeraj Verma

Il existe une version d'évaluation bash, elle exécute les commandes telles qu'elles ont été saisies sur votre shell. Par exemple, dans votre script, vous pouvez effectuer les opérations suivantes:

eval $(echo -e $runc $IP    $cc | grep Algeria)

Cela traitera votre écho dans un sous-shell et le résultat sera exécuté comme vous l'avez tapé dans votre shell, suivi de enter 

Voir ci-dessous extrait du manuel bash:

eval [arg ...] Les arguments sont lus et concaténés ensemble en une seule commande. Cette commande est ensuite lue et exécutée par le shell et son état de sortie est renvoyé sous la forme la valeur de eval. S'il n'y a pas d'argument, ou seulement des arguments nuls, eval renvoie 0.

6
Flo Doe
echo `pwd`

ci-dessus commande fonctionne pour moi.

0
Bobo

Utilisez grep -E et un motif à la place:

$runc $IP    $cc | grep -E 'Algeria|Argentina|...'

Explication: echo imprimera la commande mais ne l'exécutera pas. Ne l'utilisez pas pour exécuter la commande.

Et au lieu d'exécuter le script 5 fois, utilisez grep pour rechercher l'un des cinq modèles à la fois.

Et vous devriez utiliser 

cc=$(geoiplookup $IP)

au lieu de backticks; c'est plus sûr.

0
Aaron Digulla