villkorad binär operatör förväntas

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

Varför får jag ”villkorad binär operatör förväntas”. Jag sökte redan och. I. ser att [[]] är ett testuttalande men varför skulle det inte fungera?

Svar

  1. Du ”saknas $ framför var när du ringer till det, som om du skrev det, kommer det att vara bokstavligen var.
  2. Tänk på möjliga sårbarheter i ditt skript när du använder [[ ... ]] eller (( ... )) tillsammans med variabler som du inte kan kontrollera. I ditt fall kan det vara bättre att använda [ "$var" -ne 0 ].
  3. Du saknar ett mellanslag mellan != och 0 (detta är källan till felet!)
  4. != är en strängjämförelseoperatör , medan det kanske fungerar i ditt exempel vill du använda -ne för att jämföra heltal.

Använd shellcheck .

Kommentarer

  • Obs t hatt (( var !=0 )) skulle också fungera här, men som [[ "$var" -ne 0 ]] skulle vara en godtycklig sårbarhet för kommandoinjektion om karaktären på utdata från kommandot som fångas är inte under din kontroll.
  • Tack St é för din insikt. Anser du att [[ "$var" -ne 0 ]] är osäkra? Vad sägs om samma sak utan citat? Så vad tycker du bör föredras?
  • I [[ $var -ne 0 ]] (med eller utan offerten, citaten är inte nödvändiga i detta speciella fall) eller (( var!=0 )), innehållet i $var utvärderas som ett aritmetiskt uttryck och dåliga saker kan hända då . [ "$var" -ne 0 ] (citaten är nödvändiga här eftersom [ är ett vanligt kommando) är säkert i bash (men inte alla andra skal), eftersom $var tolkas endast som ett decimaltal. [ "$var" != 0 ] (eller [[ $var != 0 ]] kshism) är också säkert men skulle vara sant om $var innehåller 00 eftersom det ' en strängjämförelse.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *