Como imprimir “-E” no bash echo?

5

Eu quero executar o echo e obter uma saída como:

$ export EVAR="-E"
$ echo "$EVAR"
-E

Eu armazenei "-E" em uma variável bash, digamos $EVAR . Se eu executar echo $EVAR , o eco não imprimirá nada. Talvez pense que $ EVAR é um argumento -E. A citação de $EVAR nas aspas duplas também não funciona.

Como posso imprimir?

OBSERVAÇÃO : imagino que possa haver uma solução que desconheça o conteúdo de $EVAR - sem nenhuma análise do conteúdo de $ EVAR, um comando como echo some-arg $EVAR . Isso é possível? Ou devo apenas recorrer a um workround como printf ?

    
por xywang 18.12.2015 / 03:42

5 respostas

3

Você pode usar truques:

echo " $EVAR"
echo  -e "5E"
echo $'5E'

Mas como eu disse: esses são truques. A solução real é usar printf sempre:

$ printf '%s\n' "$EVAR"
-E
    
por 18.12.2015 / 05:57
1

Por solicitação, se você está bem com a saída sendo precedida por uma linha em branco, teste você mesmo esta solução, na linha de comando:

$ export EVAR="-E"
$ echo -e "\n$EVAR"

-E
  • original echo "$EVAR" não fornece nada porque, como você suspeitava, ele vê -E como uma opção reconhecida do comando echo .. man echo says: -E disable interpretation of backslash escapes (default)
  • então nós o precederemos com um caractere de espaço em branco, neste caso, uma nova linha
  • mas você não pode diretamente "\n" , então use -e para interpretar "\n"
  • é claro que isso significa que se você ainda tiver o $EVAR original, precisará fazer outra coisa na saída para remover a primeira linha em branco que apresentamos
por 18.12.2015 / 05:41
1

use printf , conforme mencionado, ou ative o shopt xpg_echo , o que lhe dá um fechamento ao padrão echo :

echo 'hi\nthere'
hi
there

mas ainda não processará um argumento -E corretamente. para que você possa escrever seus próprios pequenos padrões em conformidade com echo como:

echo()
    case  ${IFS- }  in
    (\ *) printf %b\n "$*";;
    (*)   IFS=\ $IFS
          printf %b\n "$*"
          IFS=${IFS#?}
    esac

... que depois será principalmente compatível com uma única Unix Spec echo em todos os sentidos (exceto que bash printf também rompe com o padrão na manipulação de \[num]{1,3} octals para %b ) .

... e assim ...

echo -E
-E
    
por 18.12.2015 / 06:04
0

Há sempre

echo -e "\x2DE"

Com \ x2D sendo o código hexadecimal para "-". O "E" é simplesmente acrescentado depois.

    
por 18.12.2015 / 03:48
0

Você pode usar printf em vez de echo :

$ EVAR="-E"
$ printf "%s\n" ${EVAR}
-E
    
por 18.12.2015 / 03:50

Tags