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-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 ibash
(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åller00
eftersom det ' en strängjämförelse.