web-dev-qa-db-fra.com

le script bash utilise la commande cut dans une variable et stocke le résultat dans une autre variable

J'ai un fichier config.txt avec des adresses IP comme contenu comme celui-ci

10.10.10.1:80
10.10.10.13:8080
10.10.10.11:443
10.10.10.12:80

Je veux cingler chaque IP adresse dans ce fichier

#!/bin/bash
file=config.txt

for line in `cat $file`
do
  ##this line is not correct, should strip :port and store to ip var
  ip=$line|cut -d\: -f1
  ping $ip
done

Je suis un débutant, désolé pour une telle question mais je n'ai pas pu le découvrir moi-même.

20
CodingYourLife

La solution awk est celle que j'utiliserais, mais si vous voulez comprendre vos problèmes avec bash, voici une version révisée de votre script.

#!/bin/bash -vx

##config file with ip addresses like 10.10.10.1:80
file=config.txt

while read line ; do
  ##this line is not correct, should strip :port and store to ip var
  ip=$( echo "$line" |cut -d\: -f1 )
  ping $ip
done < ${file}

Vous pouvez écrire votre ligne supérieure comme

for line in $(cat $file) ; do ...

Vous aviez besoin de la substitution de commande $( ... ) pour obtenir la valeur affectée à $ ip

la lecture de lignes à partir d'un fichier est généralement considérée comme plus efficace avec le modèle while read line ... done < ${file}.

J'espère que ça aide.

37
shellter

Vous pouvez éviter la boucle et couper etc. en utilisant:

awk -F ':' '{system("ping " $1);}' config.txt

Cependant, il serait préférable de publier un extrait de votre config.txt

7
anubhava