2017-04-25 4 views
0
#!/bin/bash 
echo "Number of hosts entered are "$# 
echo "Hostnames are "[email protected] 
for i in "[email protected]" 
do 
    echo "Logging in to the host "$i 
    pbsh [email protected]$i ' 
    ipaddr=`ip r | awk '{print $9}'` 
    if [ ipaddr = 172.*.*.* ] 
    then 
     echo "Script can not be run in this IP series" 
     exit 
    else 
     cd /var/tmp ; wget http://********** 
    fi' 
done 

Après l'exécution du script ci-dessus, l'erreur ci-dessous apparaît. Le script est en cours d'exécution mais pas de la manière souhaitée.Impossible d'imprimer en utilisant la commande awk dans le script shell

awk: cmd. ligne: 1: {print

awk: cmd. ligne: 1:^newline inattendu ou fin de chaîne

Je suis un débutant pour le script. Veuillez me corriger si quelque chose de mal dans le script.

+1

Votre Le principal problème est le '' 'à la fin de' pbsh', qui est terminé par un autre '' 'dans' awk', donc vous voulez probablement échapper à ce dernier en faisant '\ ''. Une autre chose est votre instruction 'if', qui ne sera jamais vraie à moins que vous ne vérifiiez la variable' $ ipaddr' au lieu de la chaîne ** ipaddr **. – Rogus

Répondre

0

Dans la liste que vous avez publiée, le guillemet simple d'ouverture dans la ligne pbsh est fermé par guillemet simple immédiatement suivi de la commande awk. Vous pouvez échapper à ce dernier en le préfixant avec un antislash.

Si pbsh accepte également la commande à exécuter à partir de stdin, une alternative serait d'utiliser un document HERE (voir la page de manuel bash, section ici Documents).

MISE À JOUR: Gordon Davisson a raison dans son commentaire. \' ne fonctionne pas non plus. pBSH insiste pour obtenir la commande à exécuter comme un seul argument, vous pouvez soit bricoler avec les guillemets, comme il le suggère, ou mettre l'entrée entière pour pBSH dans un fichier séparé et d'utilisation, par exemple,

pbsh [email protected]$i $(<input_script.pbsh) 
+1

L'échappement avec une barre oblique inverse ne fonctionne pas dans une chaîne entre guillemets simples. Vous devez terminer la chaîne à guillemets simples, puis utiliser une guillemets simples échappée, puis démarrer une nouvelle chaîne à guillemets simples. Quelque chose comme ceci: 'awk '\' '{print $ 9}' \ '''. Si la commande 'pbsh' l'accepte, un document ici (avec un délimiteur entre guillemets) serait plus simple. –

+0

Cela a fonctionné après avoir modifié comme awk '\' '{print $ 9}' \ ''. Mais le script affiche complètement le bloc d'instruction if lors de l'exécution. Je vais vérifier et utiliser le document ici. J'espère que ce sera bien. – Veer

+0

@Veer: Notez ma réponse mise à jour. Peut-être que cela conduit à une solution plus maintenable. – user1934428