[Risolto] BASH - Problemi di indentazione

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
Sargonsei
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2625
Iscrizione: domenica 17 febbraio 2008, 13:56

[Risolto] BASH - Problemi di indentazione

Messaggio da Sargonsei »

Ho ideato uno script con questo contenuto:

Codice: Seleziona tutto

#!/bin/bash
S1='#'         # Imposta il valore della variabile contenente la stringa da sostituire.
S0='# Controlla>' # Imposta il valore della variabile contenente la stringa sostituita.
F0='</Controlla'  # Imposta il valore della variabile contenente la stringa da aggiungere alla fine della riga modificata.
#
Fun1 () # Questa è la prima riga con cui si dichiara la funzione Fun1.
{   R1=${R0//$S1/$S0} # Mette in R1 il contenuto di R0 sostituendo i caratteri contenuti in $S1 con quelli contenuti in $S0.
    RS0=${R1}${F0}    # Aggiunge il contenuto della variabile $F0 alla fine della riga.
} # Questa è l'ultima riga in cui si dichiara la funzione Fun1.
#
echo "Lista Righe eventualmente modificate" > output.txt  # Crea file contenente output
#
# Il ciclo WHILE legge le righe del file "input.txt" e le mette, una alla volta, nella variabile $R0
while read R0
do
    if [[ ${R0} == *"${S1}"* ]]  # Verifica se la variabile $R0 contiene $R0
	then
    	    Fun1 # Comando per far eseguire la funzione Fun1
	else
    	    RS0=${R0}
	fi
    echo $RS0 >> output.txt # Inserisce la riga nel file di testo
done < input.txt
exit 0
con lo scopo di leggere un file input.txt contenente

Codice: Seleziona tutto

lspci | awk '$2 == "Audio" {system("lspci -ks " $1)}' # Testo che potrebbe essere da verificare
00:01.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Kabini HDMI/DP Audio
        Subsystem: ASUSTeK Computer Inc. Kabini HDMI/DP Audio
        Kernel driver in use: snd_hda_intel
        Kernel modules: snd_hda_intel
00:14.2 Audio device: Advanced Micro Devices, Inc. [AMD] FCH Azalia Controller (rev 02)
        Subsystem: ASUSTeK Computer Inc. FCH Azalia Controller
        Kernel driver in use: snd_hda_intel
        Kernel modules: snd_hda_intel
ed ottenere un file output.txt contenente

Codice: Seleziona tutto

Lista Righe eventualmente modificate
lspci | awk '$2 == "Audio" {system("lspci -ks " $1)}' # Controlla> Testo che potrebbe essere da verificare</Controlla
00:01.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Kabini HDMI/DP Audio
        Subsystem: ASUSTeK Computer Inc. Kabini HDMI/DP Audio
        Kernel driver in use: snd_hda_intel
        Kernel modules: snd_hda_intel
00:14.2 Audio device: Advanced Micro Devices, Inc. [AMD] FCH Azalia Controller (rev 02)
        Subsystem: ASUSTeK Computer Inc. FCH Azalia Controller
        Kernel driver in use: snd_hda_intel
        Kernel modules: snd_hda_intel
invece il file ottenuto contiene questo:

Codice: Seleziona tutto

Lista Righe eventualmente modificate
lspci | awk '$2 == "Audio" {system("lspci -ks " $1)}' # Controlla> Testo che potrebbe essere da verificare</Controlla
00:01.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Kabini HDMI/DP Audio
Subsystem: ASUSTeK Computer Inc. Kabini HDMI/DP Audio
Kernel driver in use: snd_hda_intel
Kernel modules: snd_hda_intel
00:14.2 Audio device: Advanced Micro Devices, Inc. [AMD] FCH Azalia Controller (rev 02)
Subsystem: ASUSTeK Computer Inc. FCH Azalia Controller
Kernel driver in use: snd_hda_intel
Kernel modules: snd_hda_intel
In altre parole, l'indentazione non viene conservata, falsando così l'impaginazione.
Come devo modificare lo script per conservare l'indentazione?
Ringrazio sin d'ora chi mi risponderà.
Ultima modifica di Sargonsei il domenica 8 giugno 2025, 14:50, modificato 1 volta in totale.
Postare l'output di un comando significa inserire nel post: la riga in cui si digita il comando, tutto l'output, e la riga in cui il prompt ricompare.
Hardware e Sistema Operativo di Sargonsei: http://sargonsei.altervista.org/hardwar ... r-fisso-2/
Comandi da tenere a portata di mano: https://sargonsei.altervista.org/bash-03/
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2911
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: BASH - Problemi di indentazione

Messaggio da rai »

Non ho nemmeno scaricato il tuo codice ma penso che dovresti proteggere le variabili tra doppi apici, per esempio: RS0=${R0} ---> RS0="${R0}" e echo $RS0 ---> echo "$RS0"
Avatar utente
Sargonsei
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2625
Iscrizione: domenica 17 febbraio 2008, 13:56

Re: BASH - Problemi di indentazione

Messaggio da Sargonsei »

rai ha scritto:
sabato 7 giugno 2025, 12:49
Non ho nemmeno scaricato il tuo codice ma penso che dovresti proteggere le variabili tra doppi apici, per esempio: RS0=${R0} ---> RS0="${R0}" e echo $RS0 ---> echo "$RS0"
Purtroppo questo codice non risolve il problema.

Codice: Seleziona tutto

#!/bin/bash
S1='#'         # Imposta il valore della variabile contenente la stringa da sostituire.
S0='# Controlla>' # Imposta il valore della variabile contenente la stringa sostituita.
F0='</Controlla'  # Imposta il valore della variabile contenente la stringa da aggiungere alla fine della riga modificata.
#
Fun1 () # Questa è la prima riga con cui si dichiara la funzione Fun1.
{   R1=${R0//$S1/$S0} # Mette in R1 il contenuto di R0 sostituendo i caratteri contenuti in $S1 con quelli contenuti in $S0.
    RS0=${R1}${F0}    # Aggiunge il contenuto della variabile $F0 alla fine della riga.
} # Questa è l'ultima riga in cui si dichiara la funzione Fun1.
#
echo "Lista Righe eventualmente modificate" > output.txt  # Crea file contenente output
#
# Il ciclo WHILE legge le righe del file "input.txt" e le mette, una alla volta, nella variabile $R0
while read R0
do
    if [[ ${R0} == *"${S1}"* ]]  # Verifica se la variabile $R0 contiene $R0
	then
    	    Fun1 # Comando per far eseguire la funzione Fun1
	else
    	    RS0="${R0}"
	fi
    echo "$RS0" >> output.txt # Inserisce la riga nel file di testo
done < input.txt
exit 0
E se lo provi, te ne renderai conto tu stesso.
Postare l'output di un comando significa inserire nel post: la riga in cui si digita il comando, tutto l'output, e la riga in cui il prompt ricompare.
Hardware e Sistema Operativo di Sargonsei: http://sargonsei.altervista.org/hardwar ... r-fisso-2/
Comandi da tenere a portata di mano: https://sargonsei.altervista.org/bash-03/
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2911
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: BASH - Problemi di indentazione

Messaggio da rai »

Non posso mettermi al PC per ora, mi spiace.
Comunque, ogni volta che fai un' assegnazione di una [variabile contenente una] stringa bisogna metterla tra doppi apici; il mio era solo un esempio, ci sono altre variabili che devono essere `quotate` nel codice che hai postato. Per esempio nella funzione, dove crei R1 e RS0
Avatar utente
Sargonsei
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2625
Iscrizione: domenica 17 febbraio 2008, 13:56

Re: BASH - Problemi di indentazione

Messaggio da Sargonsei »

A giudicare dall'output seguente

Codice: Seleziona tutto

cat input.txt; while read "R0"; do echo "${R0}"; done < input.txt # Visualizza contenuto di input.txt
lspci | awk '$2 == "Audio" {system("lspci -ks " $1)}' # Testo che potrebbe essere da verificare
00:01.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Kabini HDMI/DP Audio
        Subsystem: ASUSTeK Computer Inc. Kabini HDMI/DP Audio
        Kernel driver in use: snd_hda_intel
        Kernel modules: snd_hda_intel
00:14.2 Audio device: Advanced Micro Devices, Inc. [AMD] FCH Azalia Controller (rev 02)
        Subsystem: ASUSTeK Computer Inc. FCH Azalia Controller
        Kernel driver in use: snd_hda_intel
        Kernel modules: snd_hda_intel


lspci | awk '$2 == "Audio" {system("lspci -ks " $1)}' # Testo che potrebbe essere da verificare
00:01.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Kabini HDMI/DP Audio
Subsystem: ASUSTeK Computer Inc. Kabini HDMI/DP Audio
Kernel driver in use: snd_hda_intel
Kernel modules: snd_hda_intel
00:14.2 Audio device: Advanced Micro Devices, Inc. [AMD] FCH Azalia Controller (rev 02)
Subsystem: ASUSTeK Computer Inc. FCH Azalia Controller
Kernel driver in use: snd_hda_intel
Kernel modules: snd_hda_intel
non è una questione di mettere le variabili fra apici...
infatti il problema, che non si presenta leggendo il contenuto di un file di testo mediante il comando cat, si concretizza leggendo le singole righe col comando read.
Postare l'output di un comando significa inserire nel post: la riga in cui si digita il comando, tutto l'output, e la riga in cui il prompt ricompare.
Hardware e Sistema Operativo di Sargonsei: http://sargonsei.altervista.org/hardwar ... r-fisso-2/
Comandi da tenere a portata di mano: https://sargonsei.altervista.org/bash-03/
Avatar utente
Sargonsei
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2625
Iscrizione: domenica 17 febbraio 2008, 13:56

Re: [Risolto] BASH - Problemi di indentazione

Messaggio da Sargonsei »

Risolto!
Stando a quanto riportato qui
https://phoenixnap.com/kb/bash-read
il comando read legge una riga alla volta, ma ogni singola riga può contenere più campi/dati, separati fra loro da un separatore che, di default, è il carattere spazio " ", ma può essere modificato mettendo nella variabile IFS il carattere che si vuole usare come separatore.
Il separatore non è considerato parte del campo e, quando il numero di campi è superiore al numero di variabili utilizzate per leggere la riga, i campi in più vengono messi nell'ultima variabile separati da un solo campo separatore.
Ne consegue che: se il contenuto di un'intera riga viene letto da una sola variabile, la variabile conterrà tutti i campi, separati fra loro da un singolo separatore.
In altre parole, se si vuole leggere un'intera riga a mettere il contenuto in un'unica variabile, occorre impostare il separatore dandogli il valore di un carattere che la riga da leggere sicuramente non contiene (es. IFS="£").
Infatti

Codice: Seleziona tutto

IFS="£"; while read R0; do echo ${R0}; done < input.txt # Visualizza contenuto di input.txt
lspci | awk '$2 == "Audio" {system("lspci -ks " $1)}' # Testo che potrebbe essere da verificare
00:01.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Kabini HDMI/DP Audio
        Subsystem: ASUSTeK Computer Inc. Kabini HDMI/DP Audio
        Kernel driver in use: snd_hda_intel
        Kernel modules: snd_hda_intel
00:14.2 Audio device: Advanced Micro Devices, Inc. [AMD] FCH Azalia Controller (rev 02)
        Subsystem: ASUSTeK Computer Inc. FCH Azalia Controller
        Kernel driver in use: snd_hda_intel
        Kernel modules: snd_hda_intel

Postare l'output di un comando significa inserire nel post: la riga in cui si digita il comando, tutto l'output, e la riga in cui il prompt ricompare.
Hardware e Sistema Operativo di Sargonsei: http://sargonsei.altervista.org/hardwar ... r-fisso-2/
Comandi da tenere a portata di mano: https://sargonsei.altervista.org/bash-03/
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti