J'aimerais que la echo
commande soit exécutée quand ce cat /etc/passwd | grep "sysa"
n'est pas vrai.
Qu'est-ce que je fais mal?
if ! [ $(cat /etc/passwd | grep "sysa") ]; then
echo "ERROR - The user sysa could not be looked up"
exit 2
fi
bash
if-statement
syntax
boolean-expression
Sandra Schlichting
la source
la source
!
pas être à l'intérieur des supports? ie[ ! EXPR ]
Réponses:
essayer
grep
renvoietrue
s'il trouve la cible de recherche etfalse
s'il ne le fait pas.Donc PAS
false
==true
.if
Les évaluations dans les shells sont conçues pour être très flexibles, et souvent ne nécessitent pas de chaînes de commandes (comme vous l'avez écrit).De plus, en regardant votre code tel
$( ... )
quel , votre utilisation de la forme de substitution cmd est à recommander, mais pensez à ce qui sort du processus. Essayezecho $(cat /etc/passwd | grep "sysa")
de voir ce que je veux dire. Vous pouvez aller plus loin en utilisant l'-c
option (count) pour grep et ensuite faireif ! [ $(grep -c "sysa" /etc/passwd) -eq 0 ] ; then
ce qui fonctionne mais est plutôt old school.MAIS, vous pouvez utiliser les dernières fonctionnalités du shell (évaluation arithmétique) comme
ce qui vous donne également l'avantage d'utiliser les opérateurs de comparaison basés sur c-lang,
==,<,>,>=,<=,%
et peut-être quelques autres.Dans ce cas, selon un commentaire d'Orwellophile, l'évaluation arithmétique peut être encore plus détaillée, comme
OU
Enfin, il existe un prix appelé
Useless Use of Cat (UUOC)
. :-) Certaines personnes vont sauter de haut en bas et pleurer gothca! Je dirai simplement quegrep
peut prendre un nom de fichier sur sa ligne de commande, alors pourquoi invoquer des processus et des constructions de tuyaux supplémentaires lorsque vous n'êtes pas obligé? ;-)J'espère que ça aide.
la source
grep "^$user:" /etc/passwd
serait la façon la plus correcte de rechercher / etc / passwd accessoirement -grep -v
où -v inverse la recherche si vous le souhaitez pour éviter le désordre de ||(( $( cat file | grep regex | wc -l ) ? 0 : 1 ))
Je pense que cela peut être simplifié en:
ou dans une seule ligne de commande
$ grep sysa /etc/passwd || { echo "ERROR - The user sysa could not be looked up"; exit 2; }
la source
1>&2
à la fin de votreecho
impressionstderr
?!: not found
'grep
comme ceci.-q
supprime la sortie.$(...)
détient la valeur , pas le statut de sortie, c'est pourquoi cette approche est erronée. Cependant, dans ce cas spécifique, cela fonctionne bien carsysa
il sera imprimé, ce qui rendra la déclaration de test vraie. Cependant,if ! [ $(true) ]; then echo false; fi
serait toujours impriméfalse
car latrue
commande n'écrit rien sur stdout (même si le code de sortie est 0). C'est pourquoi il doit être reformuléif ! grep ...; then
.Une alternative serait
cat /etc/passwd | grep "sysa" || echo error
. Edit: Comme Alex a fait remarquer, le chat est inutile ici :grep "sysa" /etc/passwd || echo error
.J'ai trouvé les autres réponses assez confuses, j'espère que cela aide quelqu'un.
la source
Sur les systèmes Unix qui le supportent (pas macOS semble-t-il):
Cela présente l'avantage d'interroger tout service d'annuaire éventuellement utilisé (YP / NIS ou LDAP, etc.) et le fichier de base de données de mots de passe local.
Le problème avec
grep -q "$username" /etc/passwd
est qu'il donnera un faux positif quand il n'y a pas un tel utilisateur, mais quelque chose d'autre correspond au modèle. Cela peut se produire s'il existe une correspondance partielle ou exacte ailleurs dans le fichier.Par exemple, dans mon
passwd
dossier, il y a une ligne disantCela provoquerait une correspondance valide sur des choses comme
cara
etenoc
etc., même s'il n'y a pas de tels utilisateurs sur mon système.Pour qu'une
grep
solution soit correcte, vous devrez analyser correctement le/etc/passwd
fichier:... ou tout autre test similaire par rapport au premier des
:
champs délimités.la source
bash
dans ce cas.Voici une réponse à titre d'exemple:
Afin de s'assurer que les enregistreurs de données sont en ligne, un
cron
script s'exécute toutes les 15 minutes et ressemble à ceci:... et ainsi de suite pour chaque enregistreur de données que vous pouvez voir dans le montage à http://www.SDsolarBlog.com/montage
Pour info, en utilisant
&>/dev/null
redirige toutes les sorties de la commande, y compris les erreurs, vers/dev/null
(Le conditionnel ne nécessite que
exit status
laping
commande)Pour info aussi, notez que depuis
cron
travaux s'exécutent carroot
il n'est pas nécessaire de les utilisersudo ping
dans uncron
script.la source