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
- Du ”saknas
$framför var när du ringer till det, som om du skrev det, kommer det att vara bokstavligenvar. - 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 ]. - Du saknar ett mellanslag mellan
!=och0(detta är källan till felet!) -
!=är en strängjämförelseoperatör , medan det kanske fungerar i ditt exempel vill du använda-nefö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$varutvä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 ibash(men inte alla andra skal), eftersom$vartolkas endast som ett decimaltal.[ "$var" != 0 ](eller[[ $var != 0 ]]kshism) är också säkert men skulle vara sant om$varinnehåller00eftersom det ' en strängjämförelse.