AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 494725
Accepted
Harold Fischer
Harold Fischer
Asked: 2019-01-16 20:19:55 +0800 CST2019-01-16 20:19:55 +0800 CST 2019-01-16 20:19:55 +0800 CST

Quais caracteres precisam ser escapados ao usar o comando printf?

  • 772

Quero esclarecer que não estou falando sobre como escapar caracteres no nível de interpretação do shell.

Tanto quanto eu posso dizer, apenas dois caracteres precisam ser escapados: %e\

Para imprimir um literal %, você deve escapá-lo com um precedente %:

printf '%%'

Para imprimir um literal \, você deve escapá-lo com um precedente \:

printf '\\'

Existem outras instâncias em que eu precisaria escapar de um caractere para que ele fosse interpretado literalmente?

shell posix
  • 2 2 respostas
  • 17566 Views

2 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2019-11-16T04:02:05+08:002019-11-16T04:02:05+08:00

    No argumento de formato de printf, apenas os caracteres %e \são especiais (não, "não é especial e \"não é especificado por POSIX).

    Mas, duas notas importantes .

    1. Na maioria das printfimplementações¹, são os valores de byte para \e %que são especiais e a especificação POSIX pode até ser interpretada como exigindo isso, pois exige que o printfutilitário seja uma interface para a printf(3)função C e não wprintf(3)por exemplo (como requer %.3struncar para 3 bytes e não 3 caracteres ).

      Em algumas codificações de caracteres, incluindo BIG5 e GB18030, existem centenas de caracteres que contêm a codificação de barra invertida e, para escapar daqueles para printf, você precisa inserir um \antes de cada 0x5cbyte na codificação desses caracteres!

      Por exemplo, em BIG5-HKSCS, como usado por exemplo na zh_HK.big5hkscslocalidade (Hong Kong), todos Ěαжふ㘘㙡䓀䨵䪤么佢俞偅傜兝功吒吭园坼垥塿墦声娉娖娫嫹嬞孀尐岤崤幋廄惝愧揊擺暝枯柦槙檝歿汻沔涂淚滜潿瀙瀵焮燡牾狖獦珢珮琵璞疱癧礒稞穀笋箤糭綅縷罡胐胬脪苒茻莍蓋蔌蕚螏螰許豹贕赨跚踊蹾躡鄃酀酅醆鈾鎪閱鞸餐餤駹騱髏髢髿鱋鱭黠﹏?????????contêm o byte 0x5c (que também é a codificação de \).

      Com a maioria das printfimplementações, nesse locale, printf 'αb'não produz αbmas byte 0xa3(o primeiro byte da codificação de α) seguido pelo caractere BS (a expansão de \b).

      $ LC_ALL=zh_HK.big5hkscs luit
      $ locale charmap
      BIG5-HKSCS
      $ printf 'αb' | LC_ALL=C od -tx1 -tc
      0000000  a3  08
              243  \b
      0000002
      

      O melhor é evitar usar (e até instalar / disponibilizar) esses locais, pois eles causam todos os tipos de bugs e vulnerabilidades desse tipo.

    2. Algumas printfimplementações oferecem suporte a opções, e mesmo aquelas que não são necessárias para oferecer suporte --como delimitador de opção. Portanto printf --, não produzirá, --mas provavelmente relatará um erro sobre um argumento de formato ausente. Então, se você não pode garantir que seu formato não começará com -, você deve usar o --delimitador de opções:

       printf -- "$escaped_format" x y...
      

    De qualquer forma, se você quiser imprimir strings arbitrárias, você usaria:

    printf '%s\n' "$data" # with terminating newline
    printf %s "$data"     # without
    

    Não há nenhum caractere especial na string passada para %s(embora observe que, com exceção do printfembutido de zsh, você não pode passar o caractere NUL em nenhum dos printfargumentos).

    Observe que, embora a maneira canônica de inserir um literal \seja com \\e um literal %com %%, em sistemas baseados em ASCII, você também pode usar \134e \45e com algumas printfimplementações \x5c, \x25, ou \x{5c}, \x{25}, ou (mesmo em sistemas não ASCII): \u005c, \u0025ou \u{5c}, \u{25}.


    ¹ yashé printfa única exceção que conheço.

    • 11
  2. Sparhawk
    2019-01-16T20:38:36+08:002019-01-16T20:38:36+08:00

    Do manual:

    $ man printf
    ...
       printf FORMAT [ARGUMENT]...
    ...
       FORMAT controls the output as in C printf.  Interpreted sequences are:
    

    Isso lista várias sequências interpretadas. A seguir estão aqueles em que o próprio caractere precisa ser escapado.

       \"     double quote
       \\     backslash
       %%     a single %
    

    Testei esses três no bash, e eles se comportaram conforme o esperado. De acordo man bashcom , esta implementação de printfusa as "especificações de formato printf(1) padrão" como acima, além de algumas outras que não são relevantes aqui.


    No entanto, outros shells, como zshimplementam printfum pouco diferente. Aqui, as aspas duplas não devem ser escapadas.

    $ printf '"'
    "   
    $ printf '\"'
    \"
    
    • 3

relate perguntas

  • Como funciona este comando? mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc -l 1234 > /tmp/f

  • FreeBSD's sh: funções de lista

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • o que grep -v grep faz

  • Como salvar um caminho com ~ em uma variável?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve