Ich habe jede mögliche Kombination ausprobiert, um dieses Bash-Skript zum Laufen zu bringen. Es ist Teil eines größeren Skripts und fordert im Wesentlichen zur Eingabe eines Benutzernamens auf (um zu prüfen, ob dieser existiert) und gibt die entsprechende Antwort zurück:
#! /bin/bash
# Script to see if User exists
clear
echo -n "Enter user to check: "
read $uzer
grep -c '^${uzer}:' /etc/passwd
if [ $? -eq 0 ]; then
echo "User does exist :)"
else
echo "No such user"
fi
Im Terminal funktioniert Folgendes einwandfrei:
grep -c '^devuser1:' /etc/passwd
RETURNS: 1
grep -c '^devuser1234:' /etc/passwd
RETURNS: 0
Ich habe viele Kombinationen zum Übergeben der Lesevariable ausprobiert, aber '^${uzer}:'
ohne Erfolg. Irgendwelche Ideen, was ich sonst noch versuchen könnte?
Antwort1
-c
bedeutet, dass Sie wissen möchten, wie oft dieser Benutzer in ist /etc/passwd
, während $?
der Exit-Code ist. Diese sind unterschiedlich, da die Anzahl auf stdout ausgegeben wird. Verwenden Sie, $()
um stdout in eine Variable zu übertragen .
Zweites Problem: Alle Ihre Variablen, wie z. B. , $uzer
werden nicht durch ihre Werte ersetzt, wenn sie in einfachen Anführungszeichen stehen. Verwenden Sie doppelte Anführungszeichen.
number=$(grep -c "^${uzer}:" /etc/passwd)
if [ $number -gt 0 ]; then
echo "User does exist :)"
else
echo "No such user"
fi
Antwort2
Sie benötigen grep -q
. Wenn Sie nicht zwischen mehr Exit-Codes als „0“ und „andere“ unterscheiden, besteht keine Notwendigkeit, grep und if zu trennen:
if grep -q "^${uzer}:" /etc/passwd; then
echo "User does exist :)"
else
echo "No such user"
fi