Passare una variabile a uno script bash che usa 'EOF' e considera la variabile un letterale [chiuso]


9

in questo script finisco con "$ 1" che viene salvato nel file / test.

#!/bin/bash
cat > /test << 'EOF'
$1
EOF

la verità è che devo mantenere

'EOF'

come "EOF" perché il mio argomento ($ 1) contiene segni di dollaro.

ma ho bisogno di salvare quell'argomento piuttosto che $ 1


1
'perché il mio argomento ( $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.
Riccioli d'oro,

Hai fatto diverse domande correlate su questo compito che stai svolgendo e la progressione delle domande mostra che non capisci davvero cosa sta succedendo e probabilmente non stai scegliendo l'approccio più semplice. È difficile aiutarti senza sapere cosa stai cercando di fare, quindi ti consiglio di porre una domanda in cui spieghi chiaramente il tuo compito generale e non limitare le risposte all'utilizzo di un particolare strumento. Ad esempio, non dire "Voglio usare cate mantenere i segni del dollaro", ma "Voglio modificare il httpd.confper cambiare <alcune impostazioni> in <in questo modo>".
Gilles 'SO- smetti di essere malvagio' il

@Gilles, alla fine ho deciso di scrivere su un altro file tramite Python e quindi utilizzare uno script bash per scrivere quel file nel file originale che è stato modificato. questo processo è molto più semplice. cat / temp_file> $ 1
user72685

@Gilles, il motivo per cui le mie domande non hanno senso è perché il modo in cui gli script bash gestiscono le variabili trasmesse a loro. ci sono troppe cose che devono essere evase e tuttavia non c'è una funzione per codificare e decodificare al volo.
user72685,

@Gilles, l'unica cosa che aveva un senso per me un po 'era base64 ma perché uno deve codificare le proprie cose per passare a uno script bash .. sfuggire alle cose e poi provare a ricostruire le cose all'interno dello script bash .. tutte e tre le barre in avanti per sfuggire a un backtick ed ecc. mi sembra un inferno di codice
user72685

Risposte:


15

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 cats 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 $1verranno 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 cati 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 $baril 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 myfileas $1e can then cator echoit 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

Sembra che tu voglia semplicemente generare una variabile nel file. In tal caso, questo funzionerà:

echo $1 >/test

Si noti che si /testtrova nella directory principale, per la quale gli utenti ordinari in genere non dispongono dell'autorizzazione di scrittura.

EDIT: tieni presente che devi citare la stringa contenente il simbolo del dollaro nella riga di comando . È qui che avviene la sostituzione e lo script non può farci nulla dopo il fatto.


Penso che tu abbia la risposta corretta ora. +1
Riccioli d'oro,

@La risposta di MichaelHomer è molto più completa e include informazioni utili sui documenti qui che avevo dimenticato. La sua risposta dovrebbe essere accettata (a meno che qualcun altro non pubblichi una migliore, ovviamente).
Tom Zych,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.