variabili readonly in una funzione bash

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
london3
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 532
Iscrizione: domenica 19 gennaio 2014, 16:22
Desktop: ubuntu:GNOME
Distribuzione: Ubuntu 22.04.1 LTS

variabili readonly in una funzione bash

Messaggio da london3 »

Codice: Seleziona tutto

fun() {
    local readonly abc=1 # ISTRUZIONE1
    readonly local xyz=1 # ISTRUZIONE2
}
Differenza tra ISTRUZIONE1 e ISTRUZIONE2?
Computer: Lenovo ThinkPad L480
Avatar utente
Rapax
Prode Principiante
Messaggi: 70
Iscrizione: domenica 16 marzo 2008, 17:34
Desktop: Mate
Distribuzione: Ubuntu 22.04 LTS
Sesso: Maschile

Re: variabili readonly in una funzione bash

Messaggio da Rapax »

Ciao london3,
spero possa esserti di aiuto questa discussione su stackoverflow: Bash local AND readonly variable.

Saluti
Linux User # 469924 - Agere no loqui
Avatar utente
london3
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 532
Iscrizione: domenica 19 gennaio 2014, 16:22
Desktop: ubuntu:GNOME
Distribuzione: Ubuntu 22.04.1 LTS

Re: variabili readonly in una funzione bash

Messaggio da london3 »

This time it will define var1 as readonly, but it will also define a variable called local, so using this way it will not handle local as keyword, it will be a variable name.

Codice: Seleziona tutto

$ readonly local var1="val1"
$ echo ${local-UNDEFINED}
UNDEFINED
Strano...
Computer: Lenovo ThinkPad L480
Avatar utente
LucaZeta
Prode Principiante
Messaggi: 104
Iscrizione: giovedì 12 aprile 2018, 11:07
Distribuzione: Ubuntu 20.04.4 LTS

Re: variabili readonly in una funzione bash

Messaggio da LucaZeta »

london3 ha scritto:
domenica 28 maggio 2023, 3:24
Strano...
readonly setta un flag di proprietà (ro) per la variabile indicata: da quel momento non è più possibile variare il contenuto della variabile.
Può essere usato nello stesso contesto dell'assegnazione, quindi readonly foo=10 assegna il valore 10 ad una 'variabile' a sola lettura.

Non è chiaro cosa voglia ottenere con il comando: echo ${local-UNDEFINED}

Relativamente al tu questito:

Codice: Seleziona tutto

fun() {
    local readonly abc=1 # ISTRUZIONE1
    readonly local xyz=1 # ISTRUZIONE2
}
La prima istruzione assegna ad una variabile locale di nome abc il valore 1
La seconda istruzione assegna alle variabili read-only local: nessun valore e xyz: valore 1
Avatar utente
london3
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 532
Iscrizione: domenica 19 gennaio 2014, 16:22
Desktop: ubuntu:GNOME
Distribuzione: Ubuntu 22.04.1 LTS

Re: variabili readonly in una funzione bash

Messaggio da london3 »

Innanzitutto dimenticavo...

Codice: Seleziona tutto

~$ bash --version | grep version
GNU bash, versione 5.1.16(1)-release (x86_64-pc-linux-gnu)
Licenza GPLv3+: GNU GPL versione 3 o successiva <http://gnu.org/licenses/gpl.html>
Non è chiaro cosa voglia ottenere con il comando: echo ${local-UNDEFINED}
Verificare se la variabile local è definita.
https://i.stack.imgur.com/T2Fp8.png
LucaZeta ha scritto:
domenica 28 maggio 2023, 5:59

Codice: Seleziona tutto

fun() {
    local readonly abc=1 # ISTRUZIONE1
    readonly local xyz=1 # ISTRUZIONE2
}
La prima istruzione assegna ad una variabile locale di nome abc il valore 1
Che intuitivamente, e per essere precisi, dovrebbe essere anche readonly: sembra che invece readonly non abbia alcun effetto (vedi sotto).
La seconda istruzione assegna alle variabili read-only local: nessun valore e xyz: valore 1
Su xyz sono d'accordo, ma non su local.
Comunque, provo in un altro modo, e spero stavolta di farmi capire (da notare set -u)

Codice: Seleziona tutto

set -u

fun() {
    local readonly abc=123 # ISTRUZIONE1
    readonly local xyz=123 # ISTRUZIONE2
    
    abc=456 # dovrebbe essere readonly (ma non lo è)
    echo $xyz # OK
    #xyz=456 # riga 9: xyz: variabile in sola lettura (come previsto)
    echo $local
}

fun
123
riga 10: local: variabile non assegnata
E riquoto
https://stackoverflow.com/questions/454 ... y-variable
This time it will define var1 as readonly, but it will also define a variable called local, so using this way it will not handle local as keyword, it will be a variable name.
BAHHH
Computer: Lenovo ThinkPad L480
Avatar utente
LucaZeta
Prode Principiante
Messaggi: 104
Iscrizione: giovedì 12 aprile 2018, 11:07
Distribuzione: Ubuntu 20.04.4 LTS

Re: variabili readonly in una funzione bash

Messaggio da LucaZeta »

london3 ha scritto:
domenica 28 maggio 2023, 7:08

Codice: Seleziona tutto

fun() {
    local readonly abc=1 # ISTRUZIONE1
    readonly local xyz=1 # ISTRUZIONE2
}
In realtà la prima istruzione definisce 2 variabili locali di nome readonly e abc e valorizza abc con il volore 1.
A nessuna delle 2 variabili in questione viene impostato il flag r-o.

Il problema è sintattico: local eredita le opzioni di impostazione degli attributi da declare, quindi ora che è chiaro quello che vuoi, per ottenerlo è sufficiente:
  • correggere la sintassi dell'istruzione local: local -r abc=1
  • separare le istruzioni local e readonly ciascuna protagonista della propria riga di comando
Ora dovrebbe essere tutto più chiaro.

Riferimenti:
help local
help declare
Avatar utente
london3
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 532
Iscrizione: domenica 19 gennaio 2014, 16:22
Desktop: ubuntu:GNOME
Distribuzione: Ubuntu 22.04.1 LTS

Re: variabili readonly in una funzione bash

Messaggio da london3 »


In realtà la prima istruzione definisce 2 variabili locali di nome readonly e abc e valorizza abc con il volore 1.
mmmmmmmmmmhhhhhhhhhh......

Codice: Seleziona tutto

$ declare -f fun
fun () 
{ 
    set -u;
    local readonly abc=123;
    echo $readonly;
    set +u
}
$ fun
var: readonly: variabile non assegnata
Computer: Lenovo ThinkPad L480
Avatar utente
LucaZeta
Prode Principiante
Messaggi: 104
Iscrizione: giovedì 12 aprile 2018, 11:07
Distribuzione: Ubuntu 20.04.4 LTS

Re: variabili readonly in una funzione bash

Messaggio da LucaZeta »

Codice: Seleziona tutto

fun ()  { set -u; local readonly=124 abc=123; echo $readonly; set +u; }
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 7 ospiti