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-ne
til 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$var
vurderes 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$var
kun fortolkes som et decimaltal.[ "$var" != 0 ]
(eller[[ $var != 0 ]]
kshism) er også sikkert, men ville vende tilbage, hvis$var
indeholder00
som det ' en strengesammenligning.