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-nepentru 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$vareste 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$vareste interpretat doar ca un număr întreg zecimal.[ "$var" != 0 ](sau[[ $var != 0 ]]kshism) este și el sigur, dar ar reveni adevărat dacă$varconține00ca ' o comparație șir.