var="$(command1 -l "$var2" -c "command2|grep -c "search"")" if [[ var !=0 ]]; then fi
Hvorfor får jeg “betinget binær operatør forventes”. Jeg søgte allerede og. I. ser at [[]] er en testerklæring, men hvorfor fungerer det ikke?
Svar
- Dig “mangler
$foran var, når du kalder det, som du skrev det, vil det bogstaveligt talt værevar. - Overvej mulige sårbarheder i dit script, når du bruger
[[ ... ]]eller(( ... ))sammen med variabler, du ikke kan kontrollere. I dit tilfælde kan det være bedre at bruge[ "$var" -ne 0 ]. - Du mangler et mellemrum mellem
!=og0(dette er kilden til fejlen!) -
!=er en strengesammenligningsoperatør , mens det muligvis fungerer i dit eksempel, vil du bruge-netil at sammenligne heltal.
Brug shellcheck .
Kommentarer
- Bemærk t hat
(( var !=0 ))ville også fungere her, men ligesom[[ "$var" -ne 0 ]]ville være en vilkårlig sårbarhed ved kommandoindsprøjtning, hvis arten af output af kommandoen, der fanges er ikke under din kontrol. - Tak St é phane for din indsigt. Anser du
[[ "$var" -ne 0 ]]som usikker? Hvad med det samme uden tilbud? Så hvad synes du skal foretrækkes? - I
[[ $var -ne 0 ]](med eller uden anførselstegn, er citaterne ikke nødvendige i dette særlige tilfælde) eller(( var!=0 )), indholdet af$varvurderes som et aritmetisk udtryk, og dårlige ting kan ske så .[ "$var" -ne 0 ](citaterne er nødvendige her, da[er en almindelig kommando) er sikkert ibash(men ikke alle andre skaller), da$varkun fortolkes som et decimaltal.[ "$var" != 0 ](eller[[ $var != 0 ]]kshism) er også sikkert, men ville vende tilbage, hvis$varindeholder00som det ' en strengesammenligning.