Per quanto ne sapevo, ci si può aspettare che [[
e [
si comportino in gran parte lo stesso, tenendo conto di alcune funzioni extra [[
. Ma di recente ho notato una discrepanza nel modo in cui tratta bash espansioni ottale:differenza di espansione ottale tra [e [[?
$ b=010; echo $((b))
8
$ [[ $b -eq 8 ]]; echo $?
0
ma
$ [ $b -eq 8 ]; echo $?
1
$ test $b -eq 8; echo $?
1
$ [ $b -eq 10 ]; echo $?
0
Perché quest'ultima espressione cadere la conversione automatica ottale? Le espressioni come -eq
sono "aritmetiche" in base allo help test
in Bash e allo e inoltre, in base alla prossima sezione delle costanti del manuale di riferimento con uno zero iniziale, può essere trattato come ottale.
POSIX sh è un po 'meno chiara on the subject: Anche se POSIX espressioni aritmetiche ancora espandono interi leader zero al loro valore ottale, si riferisce a -eq
espressioni test
come algebrica, non aritmetica.
Esiste qualche documentazione o prova che suggerisce che bash fa una distinzione tra [[
e [
per l'espansione ottale di proposito, o è solo una funzione accidentale?
+1; ma noto che sebbene '-eq' sia descritto come un" operatore aritmetico binario ", i suoi argomenti non * sono * descritti come" espressioni aritmetiche ". Quindi, ad esempio, '[b -eq 10]' non espande il parametro shell '$ b'. Quindi, anche se certamente avrebbe più senso che l'operatore consideri '010' come significato 8 anziché 10, non vedo nulla nel manuale che contraddica davvero il comportamento che stai vedendo. – ruakh
'[[b -eq 8]]' sembra essere equivalente a '((b == 8))' (puoi omettere il '$'). La documentazione non sembra dirlo. – choroba
@choroba buon punto, non mi ero nemmeno reso conto che '[[x -eq y]]' espande xey proprio come le espressioni '(())'. – kojiro