Puncte:3

Scriptul Shell continuă să se execute chiar dacă a fost adevărat

drapel in

Am un script shell simplu pentru a verifica dacă utilizatorul există, dacă nu, adăugați acel utilizator

#!/usr/bin/bash
echo „Introduceți utilizatorul”
citiți utilizatorul -r
if [ "$(id -u "$user" &>/dev/null)" = 1 ]; atunci
  echo „utilizatorul a existat”
altfel
  useradd „$user”
  echo "adăugați parola"
  passwd „$user”
  echo „$user” &>>text.txt
  ecou "salvat"
fi

Dar nu afișează „utilizatorul echo există”. în schimb, se afișează astfel:

Introduceți utilizatorul

abcdef

useradd: utilizatorul „abcdef” există deja

adauga parola

Parolă Nouă: 

În acest caz abcdef este un utilizator existent

Vă rog să-mi spuneți ce nu merge bine aici, mulțumesc mult.

MatsK avatar
drapel mp
Un sfat pentru depanare, rulați comanda `id -u testuser` și verificați dacă rezultatul este 1. Deoarece 1 este singurul lucru care va trece la `echo "User exists"`
raj avatar
drapel cn
raj
@MatsK Even 1 nu va continua, deoarece rezultatul de la `id` este redirecționat către `/dev/null`.
Terrance avatar
drapel id
După verificarea `id -u $user &>/dev/null`, utilizați `echo $?` și va produce fie 0, fie 1. 0 înseamnă `codul de ieșire 0` sau adevărat, 1 înseamnă `codul de ieșire 1` sau fals. Sau puteți avea `dacă [[ $? == 0 ]]; apoi`, etc.
raj avatar
drapel cn
raj
@Terrance Este mai simplu să folosești `id -u $user &>/dev/null` imediat ca condiție în `if`.
Terrance avatar
drapel id
@raj nu în toate cazurile. De fapt, să o faci cu instrucțiuni `case` funcționează foarte bine. `id -u` produce numărul ID-ului utilizatorului și nu 1 sau 0. Deci, scoaterea `id -u` la >/dev/null va scăpa de 1000 dacă acesta este ID-ul utilizatorului.
raj avatar
drapel cn
raj
@Terrance Uită-te la răspunsul meu de mai jos. Folosind comanda direct ca o condiție pentru `if` (fără `$(...)` inutil) verifică codul de ieșire, nu ieșirea.
Terrance avatar
drapel id
@raj Va funcționa și asta. Al meu este doar un alt mod.
Puncte:9
drapel cn
raj

Următoarea condiție în scriptul dvs.:

if [ "$(id -u "$user" &>/dev/null)" = 1 ]; atunci

nu va fi niciodată adevărat. Ar fi adevărat numai dacă ieșire de comandă id -u „$user” &>/dev/null ar fi o singură cifră 1, dar deoarece orice ieșire din acea comandă este redirecționată /dev/null, asta nu se va întâmpla niciodată.

Înlocuiește acea linie cu

if { id -u "$utilizator" &>/dev/null ; } atunci

Această condiție verifică starea de ieșire a comenzii (și nu a acesteia ieșire ca $(...) face) și va fi adevărată dacă comanda id -u „$user” &>/dev/null reușește (adică utilizatorul există) și false dacă acesta eșuează (adică utilizatorul nu există).

drapel in
Mulțumesc pentru răspuns, funcționează!!v Dar ce diferență între [] și {}?
raj avatar
drapel cn
raj
`[` este o **comandă** (echivalent cu `test`; vezi `man [`) folosită pentru a verifica rezultatul diferitelor expresii condiționate. `{}` sunt doar paranteze pentru a include comanda. De fapt, putem sări peste `{}` cu totul (în timp ce **nu puteți** sări peste `[]`): `if id -u "$user" &>/dev/null ; atunci` va funcționa la fel de bine doar că este mai puțin lizibil.
drapel in
Nu înțeleg `[` este o comandă pentru a verifica valoarea, apoi, în comanda mea '"$(id -u "$user" &>/dev/null)" = 1` de ce nu returnează adevărat, vreau să spun , `"$(id -u "$user" &>/dev/null)"` va returna 0 sau 1, nu?
raj avatar
drapel cn
raj
Valoarea lui `$(comandă)` este **ieșirea** comenzii, de exemplu. textul pe care comanda îl tipărește. Deoarece redirecționați acea ieșire către `/dev/null`, comanda nu afișează nimic. Deci valoarea lui `$(id -u "$user" &>/dev/null)` va fi întotdeauna **un șir gol**. Comparați acel șir gol cu ​​cifra 1, care nu poate returna niciodată adevărată.
drapel in
`{` și `}` sunt de prisos. `if id -u "$utilizator" &>/dev/null; atunci` este suficient.
raj avatar
drapel cn
raj
@JanHudec Știu, dar codul este mai clar cu `{}`. Sunt acolo doar pentru stil :)
Puncte:2
drapel id

Răspunsul lui @raj este 100% corect pentru simplificarea codului.

Acestea sunt doar câteva moduri alternative de a folosi codurile de ieșire și poate arăta puțin mai multă lumină asupra modului în care pot fi utilizate.

Codul de ieșire poate fi verificat făcând un eco $? imediat după comanda dvs. de id -u $user &>/dev/null care nu trebuie înglobat în $(..) sau ceva de genul asta.

Doar incearcă id -u <nume utilizator> &>/dev/null și apoi tastați eco $? pentru a verifica codul de ieșire.

Exemplu:

terrance@terrance-ubuntu:~$ id -u terrance &>/dev/null
terrance@terrance-ubuntu:~$ echo $?
0
terrance@terrance-ubuntu:~$ id -u mark &>/dev/null
terrance@terrance-ubuntu:~$ echo $?
1

În exemplul de mai sus, utilizatorul marcă nu există pe computerul meu, deci starea de ieșire este 1.

Folosind codul de ieșire, îl puteți introduce într-un caz declarație în loc de o daca..altfel afirmație.

#!/bin/bash
echo „Introduceți numele de utilizator”
citiți utilizatorul -r
id -u „$user” &>/dev/null
cazul $? în
    0) echo „Utilizatorul există”;;
    1) adduser $user
       echo "adăugați parola"
       passwd $user
       echo $utilizator >> text.txt
       ecou "salvat";;
esac

Destul de interesant, folosind un dacă [ ]; atunci mai poate fi folosit și prin adăugarea unui eco $? în verificarea dvs. dacă, dar am observat că verificați dacă 1 să fie dacă există, dar 1 înseamnă că codul a ieșit cu 1 care înseamnă nu a fost găsit.

Adăugarea acestuia va funcționa și așa.

#!/bin/bash
echo „Introduceți numele de utilizator”
citiți utilizatorul -r
if [ $(id -u "$utilizator" &>/dev/null; echo $?) == 0 ]; atunci
    echo „Utilizatorul există”
altfel
    adduser $user
    echo "adăugați parola"
    passwd $user
    echo $utilizator >> text.txt
    ecou "salvat"
fi
drapel in
Mulțumesc, învăț multe din răspunsul tău, dar nu înțeleg de ce `echo $`, ce este asta ??
Terrance avatar
drapel id
@LêQuá»cKhánh Poate că acest lucru de aici ar putea arunca puțin mai multă lumină asupra `echo $?` pentru verificarea comenzilor de ieșire: https://askubuntu.com/questions/646526/what-is-is-it-a- variabil
Terrance avatar
drapel id
@LêQuá»cKhánh De asemenea, când a fost efectuată verificarea ca `id -u "$user" &>/dev/null; echo $?` acum sunt 2 comenzi ca 1.
drapel in
Este un truc de viață pentru shell bash =), mulțumesc mult
Terrance avatar
drapel id
@LêQuá»cKhánh Ești binevenit!
drapel in
Pot să vă mai pun o întrebare? Știu că `&>` va muta stdout și stderr în , dar în acest caz de ce trebuie să mutăm aceste valori în `/dev/null` , tot ce înțeleg acum este `id -u "$user" &>/dev/ null` returnează 0 sau 1, apoi treceți la `/dev/null` Dar tot ce ne trebuie este să verificăm este 0 sau 1, dar de ce trebuie să trecem la `/dev/null` , dacă folosesc doar ` id -u „$user” &>/dev/null` , ce s-a întâmplat? De fapt, acest cod de pe site-ul nostru și nu înțeleg pe deplin
Terrance avatar
drapel id
@LêQuá»cKhánh Utilizarea `/dev/null` este o modalitate de a șterge practic stdout-ul de când îl vedeți pe ecran. Este doar o modalitate de a menține lucrurile curate. Puteți obține același cod de ieșire sau stare fără a-l folosi, dar veți vedea toate aceste rezultate pe ecran și ar putea îngreuna folosirea codului. Simțiți-vă liber să testați codul fără `&>/dev/null`, deoarece ar trebui să funcționeze în continuare.
Terrance avatar
drapel id
@LêQuá»cKhánh 0 și 1 sunt doar starea de ieșire. Dacă rulați `id -u $user` fără nimic după acesta, acesta va produce numărul ID-ului utilizatorului. Așa cum numele meu de utilizator produce 1000, deoarece acesta este numărul meu de identificare de utilizator. Dar, dacă tast `echo $?` după acea comandă, va produce în continuare un 0, deoarece starea de ieșire a trecut.
drapel in
mulțumesc mult
drapel in
Încerc doar să mă înregistrez prin `user1="$(id -u "$user")"` și `echo "Utilizatorul este $user1"` și returnează 1007, ce înseamnă asta?
Terrance avatar
drapel id
@LêQuá»cKhánh `id -u` produce UID-ul sau numărul ID-ului utilizatorului, nu starea de ieșire. Trebuie să rulați `echo $?` ca următoarea comandă pentru a vedea care este starea de ieșire a comenzii `id -u`.
drapel in
Am înțeles acum, mulțumesc mult

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.