Ich beschäftige mich seit Tagen damit. Ich muss für einen Benutzer $1 prüfen, ob eine Umgebungsvariable $2 vorhanden ist.
Ich habe einige Fälle ausprobiert:
$ [[ -v a ]] && echo "a ok" || echo "a no"
a no
$ [[ -v $HOME ]] && echo "a ok" || echo "a no"
a no
(Also nein (ich habe es mit Bash > 4.2 versucht))
if [ su - ${1} -c "[ -z "${2}" ]" ]
Jetzt versuche ich diesen Ansatz, weil ich nicht finde, was falsch ist :/!
su - root -c "echo "$HOME" | wc | cut -d' ' -f2"
su - root -c "echo "$HOME" | wc | sed 's/ //g'"
Antwort1
Die Syntax in Ihren ersten Beispielen ist falsch. Wenn Sie schreiben:
[[ -v $HOME ]]
Dann führen Sie tatsächlich den Befehl aus:
[[ -v /home/yourusername ]]
Was natürlich scheitern wird. Sie wollen:
[[ -v HOME ]] && echo ok || echo no
Sie können dies kombinieren, um su
Folgendes zu erhalten:
su - root -c "[[ -v HOME ]]" && echo ok || echo no
Ihre letzten Beispiele funktionieren nicht, da Sie Anführungszeichen nicht verschachteln können und die Shell-Variablenerweiterung vor der Befehlsausführung erfolgt. Das heißt:
su - root -c "echo "$HOME" | wc | cut -d' ' -f2"
Der Befehl, den Sie ausführen, lautet tatsächlich:
su - root -c 'echo /home/somesuser | ...'
Wenn Sie den Wert von $HOME
aus der Perspektive von möchten root
, müssen Sie die Variablenerweiterung in der lokalen Shell verhindern, beispielsweise durch die Verwendung von einfachen Anführungszeichen:
su - root -c 'echo $HOME | ...'
Mir ist nicht klar, warum Sie die Ausgabe an übergeben wc
, da die Wortanzahl von $HOME
fast immer sein wird . Anstatt die Ausgabe von mit oder 1
nachzubearbeiten , können Sie einfach die Option verwenden, um die Wortanzahl abzurufen:wc
sed
cut
-w
su - root -c 'echo $HOME | wc -w'