var="$(command1 -l "$var2" -c "command2|grep -c "search"")" if [[ var !=0 ]]; then fi
Miért kapok “feltételes bináris operátort”? Kerestem már és. I. látom, hogy a [[]] egy teszt állítás, de miért nem működik?
Válasz
- Ön “hiányzik
$a var elől, amikor hívod, ahogy írtad, szó szerintvarlesz. - Vegye figyelembe a szkript lehetséges sérülékenységeit a
[[ ... ]]vagy a(( ... ))olyan változókkal együtt, amelyeket nem lehet ellenőrizni. Esetében jobb lehet, ha a következőt használja:[ "$var" -ne 0 ]. - Hiányzik egy szóköz a
!=és0(ez a hiba forrása!) -
!=egy karakterlánc-összehasonlító operátor , míg a példádban működhet, az-nehasználatával egész számokat akarsz összehasonlítani.
Használja a shellcheck elemet.
Megjegyzések
- Megjegyzés t A hat
(( var !=0 ))itt is működne, de az[[ "$var" -ne 0 ]]-hez hasonlóan önkényes parancsinjekciós sebezhetőség lenne, ha a rögzített parancs kimenetének jellege nincs az ön irányítása alatt. - Köszönet St é phane-nek a betekintésért. Nem tartja biztonságosnak az
[[ "$var" -ne 0 ]]alkalmazást? Mi a helyzet ugyanazokkal idézőjelek nélkül? Tehát mit gondolsz előnyben? -
[[ $var -ne 0 ]](idézőjelekkel vagy anélkül, az idézőjelek ebben az esetben nem szükségesek) vagy(( var!=0 )), az$vartartalmát aritmetikai kifejezésekként értékelik, és akkor rossz dolgok történhetnek .[ "$var" -ne 0 ](az itt szükséges idézőjelek, mivel[egy közönséges parancs) biztonságos azbash(de nem az összes többi héj), mivel az$var-et csak tizedes egész számként értelmezzük. A[ "$var" != 0 ](vagy a[[ $var != 0 ]]kshism) is biztonságos, de igaz lenne, ha$var00-t tartalmaz, mivel ' a karakterlánc-összehasonlítást tartalmazza.