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

6

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

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

a verdade é .. eu preciso manter

'EOF'

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

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

    
por user72685 21.06.2014 / 11:08

2 respostas

11

Seguindo seu pergunta anterior , parece que você quer ambos algum texto não interpretado e algum texto interpretado indo para um arquivo. Nesse caso, use dois cat s diferentes (ou echo s):

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, o heredoc sintaxe com << . Se você incluir aspas nessa sequência terminadora, como na primeira acima, o heredoc inteiro não será interpretado - sem parâmetros e sem substituições. Se você não usa aspas, como no segundo cat acima, variáveis como $1 serão substituídas por seus valores e as substituições de comando serão incluídas o texto. Você escolhe entre citar a string "EOF" ou não se você quer ou não substituições.

Para colocar os dois cat s no mesmo arquivo, estamos usando o >> redirecionamento para o segundo (e qualquer posterior) redirecionamentos: isso significa anexar ao arquivo. Para o primeiro, usamos um único > para limpar o arquivo e começar de novo.

Observe que, mesmo quando as variáveis são substituídas , qualquer variável adicional sinais de dólar no valor dessa variável não são re-substituídos:

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

produzirá:

$bar

sem substituir o valor de $bar .

No entanto, se você está fornecendo um "$" no argumento para este script inteiro, você precisa escapar dele na linha de comando ou colocar a coisa toda entre aspas simples. Alternativamente, substituição de comandos como em sua outra pergunta permite colocar o conteúdo de um arquivo inteiro diretamente, incluindo qualquer cifrão no conteúdo do arquivo. Certifique-se de citar a string de substituição aqui:

oo.sh "$(cat myfile)"

obterá o corpo de myfile como $1 e poderá usar cat ou echo conforme necessário. As mesmas limitações da minha resposta se aplicam: há um limite de quanto tempo os argumentos da linha de comando podem ser, e se o arquivo puder ficar mais longo do que isso, você deve encontrar outra abordagem. Você pode descobrir qual é o limite no seu sistema com getconf ARG_MAX

    
por 21.06.2014 / 11:29
1

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

echo $1 >/test

Note que /test está no diretório raiz, que usuários comuns não geralmente tem permissão de gravação para.

EDIT: Tenha em mente que você precisa citar a string contendo um símbolo de dólar na linha de comando . É aí que a substituição ocorre, e o script não pode fazer nada sobre isso após o fato.

    
por 21.06.2014 / 11:15