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 cat
s (ou echo
s) 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 cat
acima, variáveis como $1
serã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 cat
no 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 $bar
valor 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 myfile
como $1
e poderá então cat
ou echo
conforme 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 /test
está 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.