Fazendo eco de algo com várias aspas e caracteres-chave (&, $,!, etc.)

5

Digamos que você tenha que fazer isso em um arquivo:

RZW"a4k6[)b!^"%*X6Evf

Como você faz isso?

Minha "linha" real para eco é uma linha de 2048 caracteres.

    
por Issam2204 12.06.2015 / 17:22

4 respostas

6

Para conteúdo arbitrário, você também pode usar:

cat << 'EOF' > file
RZW"a'4$k6[)b!^"'%*X6Evf
RZW"a'4$k6[)b!^"'%*X6Evf
EOF

(desde que o conteúdo não contenha linhas que consistam exatamente em EOF e, nesse caso, você poderá usar um delimitador diferente).

Para incluir caracteres NUL ( ^@ normalmente digitados com Ctrl + V Ctrl + Espaço ou Ctrl + V Ctrl + @ ), o acima só funcionará com zsh . Com outras shells (e zsh ), você pode fazer:

cat > file

Digite o texto e pressione Ctrl + D em uma linha vazia (ou Ctrl-D duas vezes, se quiser incluir uma linha não terminada) quando terminar. / p>

Outra abordagem para lidar com dados arbitrários e possivelmente binários é usar itens como uuencode ou base64 :

Por exemplo:

 printf '
uudecode << 'EOF'
begin 644 file
$''$"'P''
'
end
EOF
' > file

Pode ser escrito:

cat << 'EOF' > file
RZW"a'4$k6[)b!^"'%*X6Evf
RZW"a'4$k6[)b!^"'%*X6Evf
EOF

(essa saída é obtida executando uuencode file < some-file , em que some-file contém esse conteúdo específico).

    
por 12.06.2015 / 17:50
6

Basta colocar aspas simples:

echo 'RZW"a4k6[)b!^"%*X6Evf' > file

Mas se você tiver alguma aspas simples na string, você precisará escapar de cada uma entre aspas duplas ( "'" ) e "colar" o resultado junto assim:

echo 'text without single quotes'"'"'and other text without single quote'
    
por 12.06.2015 / 17:41
1

Eu usaria um "documento aqui".

cat >my_file <<__EOF__
RZW"a4k6[)b!^"%*X6EvF
__EOF__

Quando o shell vê a sintaxe <<foo , ele lembra qual é o foo e continua lendo até ver foo em uma linha sozinho. Em seguida, ele passa tudo o que leu (exceto foo ) para a entrada padrão do programa.

    
por 12.06.2015 / 17:45
0

Para gerar algo para usar como argumento de linha de comando, coloque-o em uma variável (ou qualquer outra coisa que você possa garantir que entra em uma palavra - então um único argumento que é passado para printf ), então deixe o bash / ksh93 fazer o resto.

# Reading from stdin
# pbpaste | bash -c '
printf echo\ %q\n "$(cat)"
# ' | pbcopy
# Then paste it into your script and echo happily.
# Maybe I should use the 'read' builtin instead..
    
por 13.06.2015 / 08:05