operator binar condiționat așteptat

var="$(command1 -l "$var2" -c "command2|grep -c "search"")" if [[ var !=0 ]]; then fi 

De ce primesc „operator binar condiționat”. Am căutat deja și. Văd că [[]] este o declarație de test, dar de ce nu ar funcționa?

Răspunde

  1. Tu „lipsește $ în fața var când îl apelați, așa cum l-ați scris, va fi literalmente var.
  2. Luați în considerare posibile vulnerabilități ale scriptului dvs. atunci când utilizați [[ ... ]] sau (( ... )) împreună cu variabile pe care nu le puteți controla. În cazul dvs., ar putea fi mai bine să utilizați [ "$var" -ne 0 ].
  3. Vă lipsește un spațiu între != și 0 (aceasta este sursa erorii!)
  4. != este un operator de comparație șir , deși poate funcționa în exemplul dvs., doriți să utilizați -ne pentru a compara numerele întregi.

Utilizați shellcheck .

Comentarii

  • Notă t hat (( var !=0 )) ar funcționa și aici, dar la fel ca [[ "$var" -ne 0 ]] ar fi o vulnerabilitate de injecție de comandă arbitrară dacă natura ieșirii comenzii fiind capturată nu este sub controlul dvs.
  • Vă mulțumim St é phane pentru perspectivele dvs. Considerați [[ "$var" -ne 0 ]] nesigur? Dar la fel, fără ghilimele? Deci, ce credeți că ar trebui preferat?
  • În [[ $var -ne 0 ]] (cu sau fără ghilimele, ghilimelele nefiind necesare în acest caz particular) sau (( var!=0 )), conținutul $var este evaluat ca expresii aritmetice și se pot întâmpla lucruri rele . [ "$var" -ne 0 ] (ghilimelele fiind necesare aici, deoarece [ este o comandă obișnuită) este sigur în bash (dar nu toate celelalte cochilii), deoarece $var este interpretat doar ca un număr întreg zecimal. [ "$var" != 0 ] (sau [[ $var != 0 ]] kshism) este și el sigur, dar ar reveni adevărat dacă $var conține 00 ca ' o comparație șir.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *