var="$(command1 -l "$var2" -c "command2|grep -c "search"")" if [[ var !=0 ]]; then fi
Miksi saan ”ehdollisen binäärioperaattorin odotettavissa”. Etsin jo ja. Katson, että [[]] on testilausunto, mutta miksi se ei toimisi?
Vastaa
- Sinä ”puuttuu
$
varin edestä, kun kutsut sitä, kuten kirjoititkin, se on kirjaimellisestivar
. - Harkitse skriptisi mahdollisia haavoittuvuuksia käytettäessä
[[ ... ]]
tai(( ... ))
yhdessä muuttujien kanssa, joita et voi hallita. Sinun tapauksessasi saattaa olla parempi käyttää[ "$var" -ne 0 ]
. - Sinulta puuttuu väli
!=
ja0
(tämä on virheen lähde!) -
!=
on merkkijonojen vertailuoperaattori , vaikka se saattaa toimia esimerkissäsi, haluat käyttää-ne
kokonaislukujen vertaamiseen.
Käytä -tarkistusta .
Kommentit
- Huomautus t hat
(( var !=0 ))
toimisi myös täällä, mutta kuten[[ "$var" -ne 0 ]]
olisi mielivaltainen komennon injektoinnin heikkous, jos kaapatun komennon lähdön luonne ei ole sinun hallinnassasi. - Kiitos St é phane oivalluksistasi. Pidätkö
[[ "$var" -ne 0 ]]
vaarallisena? Entä sama ilman lainausmerkkejä? Joten mitä mielestäsi tulisi pitää parempana? -
[[ $var -ne 0 ]]
(lainausmerkeillä tai ilman, lainausmerkit eivät ole tarpeen tässä tapauksessa) tai(( var!=0 ))
,$var
-sisältö arvioidaan aritmeettisina lausekkeina ja voi tapahtua sitten huonoja asioita .[ "$var" -ne 0 ]
(lainausmerkit ovat välttämättömiä, koska[
on tavallinen komento) on turvallinen kohdassabash
(mutta ei kaikkia muita kuoria), koska$var
tulkitaan vain desimaalilukuna.[ "$var" != 0 ]
(tai[[ $var != 0 ]]
kshismi) on myös turvallinen, mutta palaa totta, jos$var
sisältää00
, koska se ' sa merkkijonojen vertailu.