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-ne
per 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$var
vengono 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é$var
viene interpretato solo come numero intero decimale. Anche[ "$var" != 0 ]
(o[[ $var != 0 ]]
kshism) è sicuro, ma restituirebbe true se$var
contiene00
in quanto ' sa confronto di stringhe.