Как я печатаю '-e' с эхом?

IFS=$'\n' a=($(cat phonebook.txt))
for i in $(seq ${#a[*]}); do
    [[ ${a[$i-1]} = $name ]] && echo "${a[$i]}"
done

В Bash 4 IFS=$'\n' a=($(cat phonebook.txt)) может быть заменен mapfile -t a < phonebook.txt.

grep-A1 печатает одну строку после соответствия.-x отключает regex как-F, но он только соответствует полным строкам.

grep -x "$name" -A1 phonebook.txt | tail -n1
8
16.11.2014, 00:40
5 ответов
  • с новой строкой

     эхо-en '-e\n'
    
  • без новой строки

     эхо-e '-e\c'
    
  • с пробелами вокруг:

     эхо '-e'
    эхо '-e'
    
  • использование клавиши Backspace (благодаря Joseph R.):

     эхо-e '\b-e'
    

    (это действительно производит БАКАЛАВРА НАУК SPC - e LF, но при отправке в терминал это представляется как -e, поскольку БАКАЛАВР НАУК перемещает курсор назад один столбец к левому порождению - для перезаписи SPC)

поведение удар , эхо встроенный может зависеть от версии удара. Это также зависит от среды ( POSIXLY_CORRECT, SHELLOPTS и BASHOPTS переменные), опции ( posix, xpg_echo), опции сборки и argv [0] ( sh по сравнению с удар ). Здесь протестированный с удар GNU 4.2.53 (1) , сборка по умолчанию, опции по умолчанию, пустая среда, вызванная как удар . Работы также с zsh 5.0.5 .

8
27.01.2020, 20:08

Лучшее решение - не использовать echo, а вместо этого использовать printf.

printf '%s\n' -e

Это работает с произвольными переменными:

var=-e
printf '%s\n' "$var"

...это означает, что Вам не нужно делать никакой специальной подготовки/модификации где-либо в Вашем коде, основываясь на знании того, что значение будет echod.


Кстати, спецификация команды POSIX shell для echo признает, что она неактуальна в том виде, в котором она реализована, и содержит примечание на эту тему:

Невозможно использовать эхо портно во всех POSIX-системах, если только не опущены как -n (в качестве первого аргумента), так и экранирующие последовательности.

Утилита printf может быть использована portably для эмуляции любого из традиционных поведений утилиты echo следующим образом (предполагая, что IFS имеет свое стандартное значение или не установлена):

Историческое эхо System V и требования к реализации XSI в этом томе POSIX.1-2008 эквивалентны:

printf "%b\n" "$*".

Эхо BSD эквивалентно:

, если [ "X$1" = "X-n" ]
затем
 сдвиг
 printf "%s" "$*"
другое
 printf "%s\n" "$*"

В новых приложениях рекомендуется использовать printf вместо echo.

(Выделение добавлено).


Тем не менее, в системах GNU существует альтернатива: Требование соблюдения стандартов.

$ POSIXLY_CORRECT=1 /bin/echo -e
-e
25
27.01.2020, 20:08

С эхом GNU -e с кодами ASCII для символов:

$ /bin/echo -e '\055'e
-e

055 восьмеричное число ASCII для - (см. человек ascii для справочника).

9
27.01.2020, 20:08

Используйте -n, чтобы избежать новой строки:

$ echo -n - && echo e
-e
2
27.01.2020, 20:08

Хотя очевидным, стандартным и рекомендуемым решением является использование printf, сделать это с помощью echoможет быть довольно сложно в зависимости от реализации (не так сложно, как для -n, хотя ).

POSIX.2017 совместимый echoс

POSIX требуетecho -eдля вывода -e<newline>. Так что просто

echo -e

там. POSIX-совместимые echoв этом отношении (большинство из них не являются POSIX-совместимыми в других отношениях, спецификация POSIX почти бесполезна, когда дело доходит доecho)include:

  • echo, встроенный в bash, когда обе опции xpg_echoи posixбыли включены (во время выполнения или во время сборки, например /bin/shв Apple macOS ).set -o posix; shopt -s xpg_echo(Опция posixтакже может быть включена, если она вызывается как shили когда POSIXLY_CORRECTили SHELLOPTS=posixнаходится в среде ).
  • /bin/echoсертифицированных систем UNIX (AIX, macOS, как минимум Solaris )и большинство BSD
  • echo, встроенный в dash, ksh88, оболочку Борна, csh, tcsh, posh, rc, es, akanga
  • GNUecho(/bin/echoв системах GNU ), когда POSIXLY_CORRECTнаходится в среде.
  • echo, встроенный в mksh, и некоторые другие pdksh -происходят, когда включена их опция posix.
  • echo, встроенный в yash, когда $ECHO_STYLEлибо не установлен, либо один из SYSV, XSI, BSD, DASH,RAW

реализации, поддерживающие-e

Включает echoисследований Unix V8 (, взятых из ), GNU, busybox, echo, встроенных в bash, zsh, pdkshи производных, fish, некоторые оболочки на основе ash-, такие как busybox shили shнекоторых BSD, последние версииksh93(в некоторых системах и с некоторыми значениями$PATH)с настройками по умолчанию, yashс $ECHO_STYLEодин из GNUилиZSH:

echo -e '-e\n\c'

Реализации, которые поддерживают -e, неизменно поддерживают -n, поэтому:

echo -ne '-e\n'

тоже подойдет.

зш

zsh's echo- единственная известная мне реализация, которая поддерживает конец -из -маркера опции(-).

echo - -e

Создание единственной оболочки, подобной Bourne -echo, которая может выводить произвольные данные (также потому, что она единственная поддерживает байты NUL в своих переменных и аргументах встроенных функций )сecho -E - "$data")

За исключением проблемы с байтом NUL -, другими реализациями, которые могут выводить произвольные данные, являются FreeBSD или macOS /bin/echo, где вы можете сделать:

/bin/echo "$data
\c"

(в этой реализации \cраспознается только в конце, и никакая другая управляющая последовательность не поддерживается ).

И yashх:

ECHO_STYLE=RAW echo "$data"

(однако обратите внимание, что yashпеременные могут содержать только текст, а не произвольные последовательности байтов в локалях, где не все последовательности байтов могут образовывать допустимые символы, как в тех, которые используют UTF -8 в качестве своего шарма ).

3
27.01.2020, 20:08

Теги

Похожие вопросы