var="$(command1 -l "$var2" -c "command2|grep -c "search"")" if [[ var !=0 ]]; then fi
Hvorfor får jeg «betinget binær operatør forventet». Jeg søkte allerede og. I. ser at [[]] er en testuttalelse, men hvorfor ville det ikke fungere?
Svar
- Du «mangler
$
foran var når du kaller det, som du skrev det, vil det være bokstavelig taltvar
. - Vurder mulige sårbarheter i skriptet ditt når du bruker
[[ ... ]]
eller(( ... ))
sammen med variabler du ikke kan kontrollere. I ditt tilfelle kan det være bedre å bruke[ "$var" -ne 0 ]
. - Du mangler et mellomrom mellom
!=
og0
(dette er kilden til feilen!) -
!=
er en strengesammenligningsoperatør , mens det kanskje fungerer i eksemplet ditt, vil du bruke-ne
til å sammenligne heltall.
Bruk shellcheck .
Kommentarer
- Merk t hatt
(( var !=0 ))
vil også fungere her, men som[[ "$var" -ne 0 ]]
ville være et vilkårlig sårbarhet for kommandainjeksjon hvis arten av utdataene til kommandoen som fanges er ikke under din kontroll. - Takk St é phane for din innsikt. Anser du
[[ "$var" -ne 0 ]]
som utrygg? Hva med det samme uten sitater? Så hva synes du bør foretrekkes? - I
[[ $var -ne 0 ]]
(med eller uten anførselstegn, er anførselstegn ikke nødvendig i dette spesielle tilfellet) eller(( var!=0 ))
, innholdet i$var
blir evaluert som et aritmetisk uttrykk og dårlige ting kan skje da .[ "$var" -ne 0 ]
(sitatene er nødvendige her da[
er en vanlig kommando) er trygt ibash
(men ikke alle andre skall), da$var
bare tolkes som et desimaltall.[ "$var" != 0 ]
(eller[[ $var != 0 ]]
kshism) er også trygt, men vil være sant hvis$var
inneholder00
som det ' en streng sammenligning.