Como ecoar um ou mais caracteres de tabulação usando um script bash? Quando executo esse código
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
Eu entendi isso
res=[ x] # that is [<space>x]
echo -e ' \t '
ecoará 'nova aba do espaço da guia de espaço' ( -e
significa 'habilitar a interpretação de escapes de barra invertida'):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
echo -e
que não funciona no Makefiles?echo -e
ocorre porque não é POSIX e asmake
chamadas/bin/sh
que normalmente não são usadas pelo programa usam interativamente e normalmente não foram-e
implementadas. Para portabilidade, use emprintf '\t'
vez disso.man
página doecho
comando não menciona a opção-e
. No entanto, esta opção é aceita.Use
printf
, nãoecho
.Existem várias versões diferentes do
echo
comando. Existe/bin/echo
(que pode ou não ser a versão GNU Coreutils, dependendo do sistema), e oecho
comando 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 doecho
. E você não precisa se lembrar das opções da linha de comando (com algumas exceções; o GNU Coreutils printf aceita--version
e--help
, e o bash printf embutido aceita-v var
armazenar a saída em uma variável).Para o seu exemplo:
E agora é hora de eu admitir que
echo
funcionará tão bem quanto o exemplo que você está perguntando; você só precisa colocar aspas duplas no argumento:como escreveu o kmkaplan (há dois anos e meio, eu acabei de notar!). O problema com seus comandos originais:
não está com
echo
; é que o shell substituiu a aba por um espaço antesecho
mesmo de ser visto.echo
é bom para saída simples, comoecho hello world
, mas você deve usá-printf
lo sempre que quiser fazer algo mais complexo. Você pode começarecho
a trabalhar, mas é provável que o código resultante falhe ao executá-lo com umaecho
implementação diferente ou um shell diferente.fonte
Coloque sua string entre aspas duplas :
fonte
Você também pode tentar:
fonte
você precisa usar -e flag para eco, então você pode
fonte
Na página do manual do bash:
Então você pode fazer isso:
fonte
Use o verbatim keystroke,
^V
(CTRL+V
,C-v
, qualquer que seja ).Quando você digita
^V
no 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:
Documentos bash ( qv , "inserção entre aspas")
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-
Nota: você pode usar esta estratégia com todos os tipos de caracteres incomuns. Como um retorno de carro:
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 usandols^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.fonte
grep
para pegar linhas contendotab
caracteres.Usar eco para imprimir valores de variáveis é uma armadilha comum do Bash. Link de referência:
http://mywiki.wooledge.org/BashPitfalls#echo_.24foo
fonte
Se você deseja usar
echo "a\tb"
em um script, execute o script como:Como alternativa, você pode dar ao myscript.sh a permissão de execução e executar o script.
fonte
fonte