Como posso gerar uma sequência de linhas multipline no Bash sem usar várias chamadas de eco da seguinte forma:
echo "usage: up [--level <n>| -n <levels>][--help][--version]"
echo
echo "Report bugs to: "
echo "up home page: "
Estou procurando uma maneira portátil de fazer isso, usando apenas os recursos do Bash.
echo >&2 ...
--help
(que deve ir para a saída padrão).printf
solução baseada em Gordon Davidson. Apesar de estar na sombra das abordagensecho
ou comcat
base, parece ser muito menos um argumento. É certo que o `printf' sintaxe representam um pouco de uma curva de aprendizado, mas eu gostaria de ouvido de outros inconvenientes (compatibilidade, desempenho ...?)Respostas:
Aqui, os documentos são frequentemente usados para esse fim.
Eles são suportados em todos os shells derivados de Bourne, incluindo todas as versões do Bash.
fonte
cat
não é um built-in.read -d '' help <<- EOF ...
para ler a sequência multilinha em uma variável e, em seguida, repeti o resultado.ou você pode fazer isso:
fonte
Inspirado pelas respostas perspicazes desta página, criei uma abordagem mista, que considero a mais simples e mais flexível. O que você acha?
Primeiro, defino o uso em uma variável, o que me permite reutilizá-lo em diferentes contextos. O formato é muito simples, quase WYSIWYG, sem a necessidade de adicionar nenhum caractere de controle. Isso me parece razoavelmente portátil (eu o executei no MacOS e Ubuntu)
Então eu posso simplesmente usá-lo como
ou, melhor ainda, ao analisar parâmetros, posso repeti-lo em uma única linha:
fonte
echo "$__usage"
era necessário para mim.echo $__usage
não funcionou.Use a
-e
opção e, em seguida, você pode imprimir um novo caractere de linha\n
na sequência.Amostra (mas não tenho certeza se uma boa ou não)
O engraçado é que essa-e
opção não está documentada na página do manual do MacOS enquanto ainda é utilizável. Está documentado na página de manual do Linux .fonte
echo
comando fornecido pelo sistema/bin/echo
, que no Mac OS não tem-e
opção. quando você está usando o bash nesses sistemas, seuecho
comando interno assume o controle. Você pode ver isso digitando/bin/echo whatever
e observando explicitamente a diferença de comportamento. Para ver a documentação do interno, digitehelp echo
./bin/echo
geralmente é diferente de um sistema operacional para outro e diferente do built-in do Bashecho
.echo -e
não é portátil - por exemplo, algumas implementações de eco imprimirão o "-e" como parte da saída. Se você deseja portabilidade, use printf. Por exemplo, / bin / echo no OS X 10.7.4 faz isso. O IIRC, o eco interno do bash, também era estranho no 10.5.0, mas não me lembro mais dos detalhes.echo -e
já me mordeu antes ... Definitivamente, useprintf
oucat
com um heredoc. A<<-
variante daqui docs são especialmente bom porque você pode tirar recuo líder na saída, mas travessão para facilitar a leitura no scriptComo recomendei
printf
em um comentário, provavelmente eu deveria dar alguns exemplos de seu uso (embora para imprimir uma mensagem de uso, seria mais provável que eu usasse as respostas de Dennis ou Chris).printf
é um pouco mais complexo de usar do queecho
. Seu primeiro argumento é uma string de formato, na qual escapes (como\n
) são sempre interpretados; ele também pode conter diretivas de formato começando com%
, que controlam onde e como quaisquer argumentos adicionais são incluídos nela. Aqui estão duas abordagens diferentes para usá-lo para uma mensagem de uso:Primeiro, você pode incluir a mensagem inteira na string de formato:
Observe que
echo
, ao contrário , você deve incluir explicitamente a nova linha final. Além disso, se a mensagem contiver algum%
caractere, ele deverá ser escrito como%%
. Se você deseja incluir o relatório de erros e os endereços da página inicial, eles podem ser adicionados naturalmente:Segundo, você pode usar a string de formato para imprimir cada argumento adicional em uma linha separada:
Com esta opção, adicionar o relatório de erros e os endereços da página inicial é bastante óbvio:
fonte
Também com o código-fonte recuado, você pode usar
<<-
(com um traço à direita) para ignorar as guias principais (mas não os espaços iniciais). Por exemplo, isto:Produz texto recuado sem o espaço em branco à esquerda:
fonte
Se você usar a solução de @jorge e descobrir que tudo está na mesma linha, coloque a variável entre aspas:
imprimirá tudo em uma linha enquanto
manterá as novas linhas.
fonte
cat <<EOF .... EOF