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
- Tu „lipsește
$
în fața var când îl apelați, așa cum l-ați scris, va fi literalmentevar
. - 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 ]
. - Vă lipsește un spațiu între
!=
și0
(aceasta este sursa erorii!) -
!=
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 .
(( 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.[[ "$var" -ne 0 ]]
nesigur? Dar la fel, fără ghilimele? Deci, ce credeți că ar trebui preferat?[[ $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 înbash
(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ține00
ca ' o comparație șir.