Passando uma variável para um script bash que usa 'EOF' e considera a variável um literal

Passando uma variável para um script bash que usa 'EOF' e considera a variável um literal

neste script acabo com "$1" sendo salvo no arquivo/test.

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

a verdade é que .. eu preciso manter

'EOF'

como 'EOF' porque meu argumento ($1) contém cifrões.

mas preciso que esse argumento seja salvo em vez de $ 1

Responder1

Acompanhando seupergunta anterior, parece que você querambosalgum texto não interpretado e algum texto interpretado entrando em um arquivo. Nesse caso, use dois cats (ou echos) diferentes:

cat > /test <<'EOF'
some uninterpreted text $(pwd)
not substituted: $1
EOF
cat >> /test <<EOF
but this will substitute: $1
EOF

Há algumas coisas acontecendo aqui: em primeiro lugar, oheredocsintaxe com <<. Se você incluir aspas nessa string terminadora, como na primeira acima, todo o heredoc não será interpretado - sem parâmetros e sem substituições. Se vocênãouse quaisquer aspas, como nosegundo catacima, variáveis ​​como $1serão substituídas por seus valores e substituições de comandos serão incluídas no texto. Você escolhe entre citar a string "EOF" ou não, dependendo se deseja substituições ou não.

Para colocar os dois catno mesmo arquivo que estamos usando>> redirecionamentopara o segundo (e quaisquer posteriores) redirecionamentos: isso significa anexar ao arquivo. Para o primeiro, usamos um single >para limpar o arquivo e começar do zero.

Observe que, mesmo quandovariáveis ​​são substituídas, quaisquer cifrões adicionais no valor dessa variávelnão sãose re-substituíram:

foo='$bar'
bar=hello
cat <<EOF
$foo
EOF

produzirá:

$bar

sem substituir o $barvalor de.

No entanto, se você estiver fornecendo um "$" no argumento para todo esse script, será necessário escapá-lo na linha de comando ou colocar tudo entre aspas simples. Alternativamente,substituição de comandocomo emsua outra perguntapermite inserir o conteúdo de um arquivo inteiro diretamente, incluindo quaisquer cifrões no conteúdo do arquivo. Certifique-se de citar a string de substituição lá:

oo.sh "$(cat myfile)"

obterá o corpo myfilecomo $1e poderá então catou echoconforme necessário. As mesmas limitações que emminha resposta aíaplicar: há um limite para o tamanho dos argumentos da linha de comando e, se o seu arquivo for maior que isso, você deve encontrar outra abordagem. Você pode descobrir qual é o limite do seu sistema comgetconf ARG_MAX

Responder2

Parece que você deseja simplesmente enviar uma variável para o arquivo. Nesse caso, isso funcionará:

echo $1 >/test

Observe que /testestá no diretório raiz, para o qual usuários comuns geralmente não têm permissão de gravação.

EDIT: Tenha em mente que você precisa citar a string que contém o cifrãona linha de comando. É aí que ocorre a substituição, e o script não pode fazer nada a respeito depois do fato.

informação relacionada