12
votes

Possible de faire du tuyau dans une déclaration IF?

J'ai un script qui génère environ 10 lignes à chaque fois si elle fonctionne. Le contenu de ces lignes varie.

Je voudrais vraiment pouvoir grep dans la sortie et faire des choses différentes en fonction de la sortie.

en pseudo c'est quoi Je voudrais faire xxx

ici ai-je utilisé chat / etc / mot de passe comme exemple, mais il doit être remplacé par mes scripts mentionnés ci-dessus .

Le problème est, comment puis-je saisir la sortie de Cat / etc / mot de passe dans le si / elif Conditions?


3 commentaires

Peut-être que Awk ou Perl conviennent mieux à votre tâche ..


N'utilisez pas chat si l'intention ne figure ni d'affichage ni de concaténation. Ici, vous pouvez simplement donner le fichier dans la ligne de commande Grep, car il est accepté, sinon vous pouvez simplement rediriger le fichier ( << / code>).


Vous n'avez pas besoin de continuation de la ligne après | , && et ||


7 Réponses :


3
votes

Vous venez de faire: xxx

qui jouera les commandes ... si le code de sortie du grep est 0.

N'oubliez pas que < a href = "http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?test" rel = "nofollow"> \ [ est une commande externe , probablement situé dans / usr / bin / [ (normalement, il s'agit d'un lien dur vers test et lorsqu'il est appelé [ il nécessite un correspondant ] argument). Voir aussi le Pagesfalls page ici, beaucoup d'entre eux sont liés à cette commande.


1 commentaires

+1, mais vous voudrez peut-être ajouter -q à grep pour supprimer la sortie.



2
votes

La tuyauterie dans une instruction IF est possible avec des sous-vases, mais cette solution se cassera puisque vous exécutez deux commandes grep code> sur le tuyau, le premier qui l'épuisera.

Le La meilleure solution dans votre cas est probablement de lire / etc / passwd code> dans une variable, puis grep code> IT: p>

passwd=$(cat /etc/passwd)
if (echo $passwd | grep -q root); then
     echo "root found"
fi
if (echo $passwd | grep -q nobody); then
     echo "nobody found"
fi


3 commentaires

Il est moins cher de dire ifs = lecture -r -d '' 'mot de passe pour lire le contenu du fichier dans une variable.


Ok, mais je ne vois pas comment cela mérite A -1.


Ce n'est pas le cas. Je ne sais pas qui l'a fait, mais j'ai contre-voté dans l'indignation.



4
votes

Je suggérerais d'utiliser AWK:

cat /etc/passwd |
while read; do
  if echo "$REPLY" | fgrep root; then
    something
  fi
  if echo "$REPLY" | fgrep nobody; then
    something_else
  fi
done


2 commentaires

N'utilisez pas chat comme ça, vous pouvez passer passwd directement sur awk , pendant , etc.


Vrai, mais il est souvent plus lisible de cette façon, car la source de données est à l'avant et pour analyser quelques douzaines de performance de lignes n'est vraiment pas un problème. À cette échelle, il s'agit simplement d'une question de préférence personnelle et non d'une raison de voter.



8
votes

Comme @Benoit recommande, utilisez simplement grep directement.

comme @Larsmans Notes, vous pouvez éviter une double lecture du fichier en le lisant une variable une fois.

Compte tenu de la disponibilité de bash Je le ferais comme ceci: xxx

une lecture du fichier, une ou deux invocations de < Code> Grep , pas d'autres processus ou sous-vases lancés.


5 commentaires

Solution très intéressante. Pourquoi avez-vous ifs = sur la première ligne?


En bash, vous pouvez simplement dire mot de passe = $ (


@Sandraschlichante: habitude, surtout. C'est quelque chose que je fais réflexivement lorsque vous utilisez lire et ne pas vouloir que l'entrée soit divisée, bien que ce n'était nécessaire ici.


Si vous recherchez simplement des chaînes statiques, vous pouvez utiliser case au lieu de grep - aucun processus externe du tout!


Si vous voulez être vraiment précis, vous devez utiliser si getent passwd root> / dev / null; Puis ... fi mais je suppose que peu de gens se soucient vraiment de faire ce droit.



0
votes

Dans l'affaire Général, vous pouvez utiliser un fichier temporaire.

if $option_count ; then
    wc -l
else
    tac
fi <file


0 commentaires

1
votes

Il suffit d'utiliser &&: xxx


0 commentaires

1
votes

Que diriez-vous des éléments suivants:

#!/bin/bash

if [ -z $1 ]; then
   echo Usage: $0 [UID to search for]
   exit 1;
fi

SEARCHID="$1"

function notFound() {
    echo NOT FOUND 
}

function found() {
    echo Found it
}

function main() {

    grep -i $SEARCHID /etc/passwd
    # Move $? to a variable 
    SEARCHRESULT=$?

    if [ "$SEARCHRESULT" != "0" ]; then
       notFound;
    else
       found;
    fi
}

# call main function
main


0 commentaires