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ää-nekokonaislukujen 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$vartulkitaan vain desimaalilukuna.[ "$var" != 0 ](tai[[ $var != 0 ]]kshismi) on myös turvallinen, mutta palaa totta, jos$varsisältää00, koska se ' sa merkkijonojen vertailu.