Como não imprimir uma nova linha com echo (e wc) em um script de shell?

5

Eu fiz este script:

#! /bin/sh  
path="foo" 
while touch $path ; do 
    path=./${path} 
done 

echo "echec avec le nom $path qui fait" 
echo $path|wc -c 
echo "caracteres"

Como posso imprimir na mesma linha as 3 linhas de eco?

    
por user3581976 13.07.2014 / 15:09

3 respostas

6

Para suprimir a nova linha com o echo usado nos sistemas linux 1 , use -n :

echo -n "echec avec le nom $path qui fait"

No entanto, wc também imprime uma nova linha e não pode ser suprimida, mas pode ser descartada:

size=$(echo $path | wc -c);
echo "echec avec le nom $path qui fait $((size-1)) caracteres"

Eu usei $((size-1)) aqui porque wc terá contado a saída de nova linha por eco. Você poderia, em vez disso, usar size=$(echo -n $path | wc -c) , mas cuidado com a advertência sobre a não-padronização de -n .

1. O -n implementado pelo eco do núcleoutil do GNU não é padrão, portanto, YMMV. Felizmente, você não precisa usá-lo aqui.

    
por 13.07.2014 / 15:15
9

Seria muito melhor se você não usasse echo . O uso de echo quando combinado com entrada arbitrária pode ter efeitos não intencionais. Além do mais, você não precisa de wc para contar os caracteres em uma variável de shell - o shell pode fazer isso tão bem quanto sem executar um processo separado para inicializar.

Por exemplo:

com wc :

_path=/some/place/in/my/filesystem
printf %s "$_path" | wc -c

###OUTPUT###
28

não wc :

printf %s "${#_path}"

###OUTPUT###
28

dois argumentos printf :

printf 'Arg char count:\t%s\nArg contents:\t%s\n' \                                                                    
    "${#_path}" "$_path"

###OUTPUT###
Arg char count: 28
Arg contents:   /some/place/in/my/filesystem

seu comando:

printf 'echec avec le nom %s qui fait %s caracteres\n' \
    "$_path" "${#_path}"

###OUTPUT###
echec avec le nom /some/place/in/my/filesystem qui fait 28 caracteres

Veja Por que printf é melhor que echo? e as especificações em Expansão do parâmetro POSIX para obter mais informações.

    
por 14.07.2014 / 01:03
0

A opção -n com echo suprime a nova linha. Então, você pode fazer:

echo -n "echec avec le nom $path qui fait" 
echo -n $(echo $path|wc -c)
echo "caracteres"
    
por 13.07.2014 / 15:15