GNU/Linux >> Linux Esercitazione >  >> Linux

Shell - Scrive contenuti variabili in un file

Nessuna delle risposte precedenti funziona se la tua variabile:

  • inizia con -e
  • inizia con -n
  • inizia con -E
  • contiene un \ seguito da un n
  • non dovrebbe essere aggiunta una nuova riga dopo

e quindi non si può fare affidamento su di essi per contenuti di stringhe arbitrarie.

In bash, puoi usare "here strings" come:

cat <<< "$var" > "$destdir"

Come notato nel commento di Ash qui sotto, la risposta di @Trebawa (formulata nella stessa stanza della mia!) usando printf è un approccio migliore di cat .


Tutto quanto sopra funziona, ma deve anche aggirare un problema (escape e caratteri speciali) che non è necessario che si verifichi in primo luogo:caratteri speciali quando la variabile viene espansa dalla shell. Basta non farlo (espansione variabile) in primo luogo. Usa la variabile direttamente, senza espansione.

Inoltre, se la tua variabile contiene un segreto e vuoi copiare quel segreto in un file, potresti non voler avere l'espansione nella riga di comando poiché l'eco di traccia/comando dei comandi della shell potrebbe rivelare il segreto. Significa tutte le risposte che usano $var nella riga di comando può avere un potenziale rischio per la sicurezza esponendo il contenuto della variabile al tracciamento e al logging della shell.

Per le variabili che sono già state esportate, usa questo:

printenv var >file

Ciò significa, nel caso della domanda OP:

printenv var >"$destfile"

Nota:i nomi delle variabili fanno distinzione tra maiuscole e minuscole.

Attenzione:non è una buona idea esportare una variabile solo per il gusto di stamparla con printenv. Se disponi di una variabile di script non esportata che contiene un segreto, l'esportazione la esporrà a tutti i futuri processi figlio (a meno che non venga esportata, ad esempio utilizzando export -n ).


Usa il echo comando:

var="text to append";
destdir=/some/directory/path/filename

if [ -f "$destdir" ]
then 
    echo "$var" > "$destdir"
fi

Il if verifica che $destdir rappresenta un file.

Il > aggiunge il testo dopo aver troncato il file. Se vuoi solo aggiungere il testo in $var al contenuto esistente del file, quindi usa >> invece:

echo "$var" >> "$destdir"

Il cp comando è usato per copiare file (su file), non per scrivere testo su un file.


echo ha il problema che if var contiene qualcosa come -e , verrà interpretato come un flag. Un'altra opzione è printf , ma printf "$var" > "$destdir" espanderà tutti i caratteri di escape nella variabile, quindi se la variabile contiene barre rovesciate il contenuto del file non corrisponderà. Tuttavia, poiché printf interpreta solo le barre rovesciate come escape nella stringa di formato, puoi usare %s specificatore di formato per memorizzare l'esatto contenuto della variabile nel file di destinazione:

printf "%s" "$var" > "$destdir"


Linux
  1. Memorizzazione dell'output del comando nella variabile Shell?

  2. Eseguire operazioni di scrittura atomica in un file in Bash?

  3. Come scrivere un file in un altro?

  4. Scrivi tutto Tmux Scorri indietro su un file?

  5. Come creare un file temporaneo nello script della shell?

Bash:Scrivi su file

Spiegazione del comando di esportazione in Linux

Che cos'è Subshell in Linux?

Cos'è un file .sh?

Trovare il contenuto di un file in un altro file

Inversione del contenuto di una variabile tramite parole