Qual è il concetto di linguaggio di programmazione per non valutare un'espressione di default in bash?

8

In Bash, per aumentare un valore intero memorizzato in una variabile, dobbiamo usare esplicitamente l'espansione aritmetica.

 i=1
 i=$((i+1))

In caso contrario

 i=1
 i=i+1

non valuterà l'espressione i+1 , ma assegnerà l'espressione come una stringa alla variabile.

Questo è molto innaturale rispetto ad altri linguaggi di programmazione, in cui un'espressione viene valutata per impostazione predefinita.

Nella programmazione del linguaggio di programmazione o concetti, c'è un concetto o una terminologia per tale caratteristica in bash?

Che senso ha non valutare un'espressione, ma trattarla come una stringa per impostazione predefinita?

Questa funzionalità è correlata ai tempi di valutazione, come la valutazione lazy?

Grazie.

    
posta Tim 22.10.2016 - 18:08
fonte

4 risposte

15

Non c'è un concetto speciale qui. Invece, tutto nella shell è una stringa letterale, a meno che non si usi esplicitamente un'espansione. Questa decisione di progettazione semplifica l'assegnazione, bene, dei valori letterali, che è il caso d'uso principale delle assegnazioni:

varname=value

non cerca una variabile chiamata value , ma usa letteralmente la stringa value . In fondo, la maggior parte dei caratteri "speciali" come + - / ecc. Non sono speciali in alcun modo: sono solo parte delle parole letterali come i caratteri alfabetici.

La sintassi di espansione ci consente di incorporare facilmente i valori all'interno di un modello, ad es.

echo "Hello ${name}!"

(Si noti che nella shell, virgolette come '…' o "…" non delimitano le stringhe, cambiano invece le espansioni applicate - le virgolette singole sopprimono tutte le espansioni e la divisione delle parole, le virgolette sopprimono la divisione delle parole e l'espansione globale ma non espansione variabile, espansione aritmetica (solo Bash) o sostituzione di comando. Le seguenti parole sono equivalenti: foo\ bar , foo' 'bar , 'foo bar' .)

Una conseguenza dell'approccio "tutto è una stringa per impostazione predefinita" è che i programmi che non utilizzano solo stringhe semplici diventano più complicati. La sintassi dell'array di Bash è notoriamente confusa. L'espansione aritmetica è in qualche modo non ovvia. Tuttavia, tali programmi non sono adatti per gli script di shell.

Lettura consigliata: la descrizione POSIX della sintassi e della semantica della shell: link

    
risposta data 22.10.2016 - 18:37
fonte
7

Puoi farlo funzionare così, se ti va. Tutto nella shell è una stringa letterale, a meno che tu non dica esplicitamente di essere qualcos'altro. Ad esempio, le seguenti stampe 2:

typeset -i x
x=1
x=x+1
echo $x

Devi solo dire alla shell che la variabile è un intero invece di una stringa. Lo stesso è vero se vuoi che la variabile sia una matrice.

    
risposta data 27.10.2016 - 02:43
fonte
1

È il

string interpolation

regole per quella lingua.

Per bash le regole sono che il testo è letterale a meno che non si usi il formato "#{name}" .

Vedi anche link

    
risposta data 25.11.2016 - 19:08
fonte
0

Il concetto qui è "retrocompatibilità". La shell Bourne ha trattato tutto come stringhe, quindi bash deve essere impostato per impostazione predefinita o tutti gli script di pre-bash si interrompono.

    
risposta data 25.11.2016 - 17:10
fonte

Leggi altre domande sui tag