Nessuna delle risposte precedenti funziona se la tua variabile:
- inizia con
-e
- inizia con
-n
- inizia con
-E
- contiene un
\
seguito da unn
- 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"