Труба в сценарии оболочки

Я сделал этот маленький скрипт:

#! /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" 

Как я могу напечатать на той же линии 3 эхо-строки? Заранее спасибо 😉

Чтобы подавить новую строку с echo используемым в Linux-системах 1 , используйте -n :

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

Тем не менее, wc также печатает новую строку и не может быть подавлен, но ее можно отбросить:

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

Я использовал $((size-1)) здесь, потому что wc подсчитал вывод новой строки с помощью эха. Вместо этого вы можете использовать size=$(echo -n $path | wc -c) , но остерегайтесь оговорки о нестандартности -n .


1. -n реализованный эхом GNU coreutil, является нестандартным, поэтому YMMV. К счастью, вам не нужно использовать его здесь.

Было бы намного лучше, если бы вы не использовали echo вообще. Использование echo сочетании с произвольным вводом может иметь непреднамеренные эффекты. Более того, вам не нужно wc для подсчета символов в переменной оболочки – оболочка может сделать это так же хорошо и без выполнения отдельного процесса для загрузки.

Например:

с wc :

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

нет wc :

 printf %s "${#_path}" ###OUTPUT### 28 

два аргумента 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 

ваша команда:

 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 

См. Почему printf лучше, чем эхо? и спецификации для расширения параметра POSIX для получения дополнительной информации.

Опция -n с echo подавляет новую строку. Итак, вы можете сделать:

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