In seguito alla domanda precedente , sembra che tu voglia inserire sia un testo non interpretato che un testo interpretato in un file. In tal caso, utilizzare due differenti cat
s echo
:
cat > /test <<'EOF'
some uninterpreted text $(pwd)
not substituted: $1
EOF
cat >> /test <<EOF
but this will substitute: $1
EOF
Qui ci sono un paio di cose: in primo luogo, la sintassi ereditaria con <<
. Se includi virgolette in quella stringa di terminazione, come nella prima sopra, l'intera eredità non viene interpretata - nessun parametro e nessuna sostituzione. Se non si utilizzano virgolette, come nel secondo cat
sopra, le variabili come $1
verranno sostituite dai loro valori e le sostituzioni di comandi verranno incluse nel testo. Puoi scegliere se citare la stringa "EOF" in base al fatto che tu voglia sostituire o meno.
Per mettere entrambi cat
i messaggi nello stesso file, stiamo usando il >>
reindirizzamento per il secondo (e tutti i successivi) reindirizzamenti: ciò significa aggiungere al file. Per il primo, usiamo un singolo >
per cancellare il file e ricominciare da capo.
Si noti che, anche quando le variabili vengono sostituite , eventuali segni di dollaro aggiuntivi nel valore di quella variabile non vengono sostituiti da soli:
foo='$bar'
bar=hello
cat <<EOF
$foo
EOF
produrrà:
$bar
senza sostituire $bar
il valore di.
Tuttavia, se stai fornendo un "$" nell'argomento all'intero script, devi scappare dalla riga di comando o racchiudere il tutto tra virgolette singole. In alternativa, la sostituzione dei comandi come nell'altra domanda ti consente di inserire direttamente il contenuto di un intero file, inclusi eventuali segni di dollaro nel contenuto del file. Assicurati di citare la stringa di sostituzione lì:
oo.sh "$(cat myfile)"
otterrà il corpo di myfile
as $1
e can then cat
or echo
it come richiesto. Si applicano le stesse limitazioni della mia risposta : esiste un limite per quanto tempo possono essere gli argomenti della riga di comando e se il tuo file potrebbe richiedere più tempo, dovresti trovare un altro approccio. Puoi scoprire qual è il limite sul tuo sistemagetconf ARG_MAX
$1
) contiene segni di dollaro.' Non se si riferisce al primo parametro della riga di comando. La sostituzione è stata eseguita su quello prima dell'esecuzione dello script. Devi scappare dalla riga di comando.