Žádná z výše uvedených odpovědí nefunguje, pokud vaše proměnná:
- začíná
-e
- začíná
-n
- začíná
-E
- obsahuje
\
následujen
- by za něj neměl být připojen nový řádek navíc
a nelze se na ně tedy spolehnout pro obsah libovolného řetězce.
V bash můžete použít "here strings" jako:
cat <<< "$var" > "$destdir"
Jak je uvedeno v komentáři Ash níže, odpověď @Trebawa (formulovaná ve stejné místnosti jako já!) pomocí printf
je lepší přístup než cat
.
Všechny výše uvedené fungují, ale také musí obejít problém (úniky a speciální znaky), který se nemusí vyskytovat:Speciální znaky, když je proměnná rozbalena shellem. Hlavně to nedělejte (variabilní expanze). Použijte proměnnou přímo, bez expanze.
Pokud vaše proměnná obsahuje tajný klíč a chcete ho zkopírovat do souboru, možná nebudete chtít mít rozšíření v příkazovém řádku, protože trasování/ozvěna příkazů příkazů shellu by mohlo tajemství odhalit. To znamená, že všechny odpovědi, které používají $var
v příkazovém řádku může mít potenciální bezpečnostní riziko vystavením obsahu proměnné sledování a protokolování shellu.
Pro proměnné, které jsou již exportovány, použijte toto:
printenv var >file
To znamená, v případě otázky OP:
printenv var >"$destfile"
Poznámka:V názvech proměnných se rozlišují velká a malá písmena.
Upozornění:Není dobré exportovat proměnnou jen kvůli jejímu tisku pomocí printenv. Pokud máte neexportovanou proměnnou skriptu, která obsahuje tajný klíč, exportem ji zpřístupníte všem budoucím podřízeným procesům (pokud nebude neexportována, například pomocí export -n
).
Použijte echo
příkaz:
var="text to append";
destdir=/some/directory/path/filename
if [ -f "$destdir" ]
then
echo "$var" > "$destdir"
fi
if
testuje, že $destdir
představuje soubor.
>
připojí text po zkrácení souboru. Pokud chcete pouze připojit text v $var
k existujícímu obsahu souboru, pak použijte >>
místo toho:
echo "$var" >> "$destdir"
cp
příkaz se používá pro kopírování souborů (do souborů), nikoli pro zápis textu do souboru.
echo
má problém, že pokud var
obsahuje něco jako -e
, bude to interpretováno jako vlajka. Další možností je printf
, ale printf "$var" > "$destdir"
rozšíří všechny uvozené znaky v proměnné, takže pokud proměnná obsahuje zpětná lomítka, obsah souboru se nebude shodovat. Protože však printf
interpretuje pouze zpětná lomítka jako escape ve formátovacím řetězci, můžete použít %s
specifikátor formátu pro uložení přesného obsahu proměnné do cílového souboru:
printf "%s" "$var" > "$destdir"