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
с новой строкой
эхо-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
.
Лучшее решение - не использовать echo
, а вместо этого использовать printf
.
printf '%s\n' -e
Это работает с произвольными переменными:
var=-e
printf '%s\n' "$var"
...это означает, что Вам не нужно делать никакой специальной подготовки/модификации где-либо в Вашем коде, основываясь на знании того, что значение будет echo
d.
Кстати, спецификация команды 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
С эхом GNU
-e
с кодами ASCII для символов:
$ /bin/echo -e '\055'e
-e
055
восьмеричное число ASCII для -
(см. человек ascii
для справочника).
Используйте -n
, чтобы избежать новой строки:
$ echo -n - && echo e
-e
Хотя очевидным, стандартным и рекомендуемым решением является использование printf
, сделать это с помощью echo
может быть довольно сложно в зависимости от реализации (не так сложно, как для -n
, хотя ).
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 echo
(/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 в качестве своего шарма ).