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 en pseudo c'est quoi Je voudrais faire p> ici ai-je utilisé Le problème est, comment puis-je saisir la sortie de grep code> dans la sortie et faire des choses différentes en fonction de la sortie. P> chat / etc / mot de passe code> comme exemple, mais il doit être remplacé par mes scripts mentionnés ci-dessus . P> Cat / etc / mot de passe code> dans le si code> / elif Code> Conditions? P> P>
7 Réponses :
Vous venez de faire: qui jouera les commandes N'oubliez pas que < a href = "http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?test" rel = "nofollow"> ... code> si le code de sortie du grep est 0. P> \ [ code> est une commande externe , probablement situé dans / usr / bin / [ code> (normalement, il s'agit d'un lien dur vers test code> et lorsqu'il est appelé [ code> il nécessite un correspondant ] code> argument). Voir aussi le Pagesfalls page ici, beaucoup d'entre eux sont liés à cette commande. P> p>
+1, mais vous voudrez peut-être ajouter -q code> à grep code> pour supprimer la sortie.
La tuyauterie dans une instruction IF est possible avec des sous-vases, mais cette solution se cassera puisque vous exécutez deux commandes Le La meilleure solution dans votre cas est probablement de lire grep code> sur le tuyau, le premier qui l'épuisera. / 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
Il est moins cher de dire ifs = lecture -r -d '' 'mot de passe etc / passwd code> 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.
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
N'utilisez pas chat code> comme ça, vous pouvez passer passwd code> directement sur awk code>, pendant code>, 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.
Comme @Benoit recommande, utilisez simplement comme @Larsmans Notes, vous pouvez éviter une double lecture du fichier en le lisant une variable une fois. P> Compte tenu de la disponibilité de une lecture du fichier, une ou deux invocations de < Code> Grep code>, pas d'autres processus ou sous-vases lancés. P> p> grep code> directement. bash code> Je le ferais comme ceci: p>
Solution très intéressante. Pourquoi avez-vous ifs = code> sur la première ligne?
En bash, vous pouvez simplement dire mot de passe = $ ( etc / etc / passwd) code>
@Sandraschlichante: habitude, surtout. C'est quelque chose que je fais réflexivement lorsque vous utilisez lire code> 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 code> au lieu de grep code> - aucun processus externe du tout!
Si vous voulez être vraiment précis, vous devez utiliser si getent passwd root> / dev / null; Puis ... fi code> mais je suppose que peu de gens se soucient vraiment de faire ce droit.
Dans l'affaire Général, vous pouvez utiliser un fichier temporaire.
if $option_count ; then
wc -l
else
tac
fi <file
Il suffit d'utiliser &&:
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
Peut-être que Awk ou Perl conviennent mieux à votre tâche ..
N'utilisez pas
chat code> 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
| code>,&& code> et|| code>