var="$(command1 -l "$var2" -c "command2|grep -c "search"")" if [[ var !=0 ]]; then fi
Perché ricevo “operatore binario condizionale previsto”. Ho già cercato e. I. vedo che [[]] è unistruzione di prova, ma perché non dovrebbe funzionare?
Risposta
- Tu “re missing
$davanti a var quando lo chiami, come lhai scritto tu, sarà letteralmentevar. - Considera le possibili vulnerabilità del tuo script quando utilizzi
[[ ... ]]o(( ... ))insieme a variabili che non puoi controllare. Nel tuo caso, potrebbe essere meglio usare[ "$var" -ne 0 ]. - Ti manca uno spazio tra
!=e0(questa è lorigine dellerrore!) -
!=è un operatore di confronto di stringhe , anche se potrebbe funzionare nel tuo esempio, puoi utilizzare-neper confrontare i numeri interi.
Utilizza shellcheck .
Commenti
- Nota t hat
(( var !=0 ))funzionerebbe anche qui, ma come[[ "$var" -ne 0 ]]sarebbe una vulnerabilità di iniezione di comando arbitrario se la natura delloutput del comando catturato non è sotto il tuo controllo. - Grazie St é phane per i tuoi approfondimenti. Consideri
[[ "$var" -ne 0 ]]non sicuro? E lo stesso senza virgolette? Quindi, cosa pensi dovrebbe essere preferito? - In
[[ $var -ne 0 ]](con o senza virgolette, le virgolette non sono necessarie in questo caso particolare) o(( var!=0 )), i contenuti di$varvengono valutati come espressioni aritmetiche e possono succedere cose brutte .[ "$var" -ne 0 ](le virgolette sono necessarie qui perché[è un comando ordinario) è sicuro inbash(ma non tutte le altre shell), poiché$varviene interpretato solo come numero intero decimale. Anche[ "$var" != 0 ](o[[ $var != 0 ]]kshism) è sicuro, ma restituirebbe true se$varcontiene00in quanto ' sa confronto di stringhe.