Respostas:
echo -e ' \t '
ecoará 'nova aba do espaço da guia de espaço' ( -esignifica 'habilitar a interpretação de escapes de barra invertida'):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
echo -eque não funciona no Makefiles?
echo -eocorre porque não é POSIX e as makechamadas /bin/shque normalmente não são usadas pelo programa usam interativamente e normalmente não foram -eimplementadas. Para portabilidade, use em printf '\t'vez disso.
manpágina do echocomando não menciona a opção -e. No entanto, esta opção é aceita.
Use printf, não echo.
Existem várias versões diferentes do echocomando. Existe /bin/echo(que pode ou não ser a versão GNU Coreutils, dependendo do sistema), e o echocomando está embutido na maioria dos shells. Versões diferentes têm maneiras diferentes (ou não) de especificar ou desativar escapes para caracteres de controle.
printf, por outro lado, tem muito menos variação. Ele pode existir como um comando, normalmente /bin/printf, e está embutido em alguns shells (o bash e o zsh têm, o tcsh e o ksh não), mas as várias versões são muito mais parecidas entre si do que as diferentes versões do echo. E você não precisa se lembrar das opções da linha de comando (com algumas exceções; o GNU Coreutils printf aceita --versione --help, e o bash printf embutido aceita -v vararmazenar a saída em uma variável).
Para o seu exemplo:
res=' 'x # res = "\t\tx"
printf '%s\n' "[$res]"
E agora é hora de eu admitir que echofuncionará tão bem quanto o exemplo que você está perguntando; você só precisa colocar aspas duplas no argumento:
echo "[$res]"
como escreveu o kmkaplan (há dois anos e meio, eu acabei de notar!). O problema com seus comandos originais:
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
não está com echo; é que o shell substituiu a aba por um espaço antes echomesmo de ser visto.
echoé bom para saída simples, como echo hello world, mas você deve usá- printflo sempre que quiser fazer algo mais complexo. Você pode começar echoa trabalhar, mas é provável que o código resultante falhe ao executá-lo com uma echoimplementação diferente ou um shell diferente.
Você também pode tentar:
echo Hello$'\t'world.
você precisa usar -e flag para eco, então você pode
echo -e "\t\t x"
Na página do manual do bash:
Palavras da forma $ 'string' são tratadas especialmente. A palavra se expande para string, com caracteres de escape com barra invertida substituídos conforme especificado pelo padrão ANSI C.
Então você pode fazer isso:
echo $'hello\tworld'
Use o verbatim keystroke, ^V( CTRL+V, C-v, qualquer que seja ).
Quando você digita ^Vno terminal (ou na maioria dos editores de Unix), o seguinte caractere é escolhido literalmente . Você pode usar isso para digitar um caractere de tabulação literal dentro de uma string que você está ecoando.
Algo como o seguinte funciona:
echo "^V<tab>" # CTRL+V, TAB
Documentos bash ( qv , "inserção entre aspas")
inserção entre aspas (Cq, Cv) Adicione o próximo caractere digitado à linha literalmente. Isto é como inserir sequências de teclas como Cq, por exemplo.
nota lateral: de acordo com isso, ALT+TAB deve fazer a mesma coisa, mas todos vinculamos essa sequência à alternância de janelas para que não possamos usá-la
inserção de tabulação (M-TAB) Insere um caractere de tabulação.
-
Nota: você pode usar esta estratégia com todos os tipos de caracteres incomuns. Como um retorno de carro:
echo "^V^M" # CTRL+V, CTRL+M
Isso ocorre porque o retorno de carro é ASCII 13 e M é a 13ª letra do alfabeto; portanto, quando você digita ^M, obtém o 13º caractere ASCII. Você pode vê-lo em ação usando ls^M, em um prompt vazio, o qual inserirá um retorno de carro, fazendo com que o prompt atue exatamente como você pressiona o retorno. Quando esses caracteres são normalmente interpretados, literalmente você obtém o caractere literal.
greppara pegar linhas contendo tabcaracteres.
Usar eco para imprimir valores de variáveis é uma armadilha comum do Bash. Link de referência: