Ключевое различие между этими двумя последовательностями команд заключается в том, что вторая содержит echo $b
которая выполняет разбиение слов оболочки. Чтобы вторая последовательность команд выполнялась так же, как и первая, замените:
echo $b | grep "*)>nS4XkrlH @XUL"
с:
echo "$b" | grep "*)>nS4XkrlH @XUL"
Расщепление слов
Посмотрите, как обрабатываются пробелы в этих двух echo
выражениях:
$ b="a b c"
$ echo "$b"
a b c
$ echo $b
a b c
Без двойных кавычек оболочка выполняет разбиение слов по аргументам echo
. Это означает, что все последовательные пробелы сгущаются в одно пространство. В двойных кавычках расщепление слов подавляется и пробелы сохраняются.
Разделение слов и шаблон grep
с несколькими пробелами
Ваш шаблон grep
содержит два последовательных пробела. Если аргумент echo
в двойных кавычках, выходные данные echo
не будут иметь этих двух пробелов и совпадение не будет найдено. Заметим:
$ b="*)>nS4XkrlH @XUL"
$ echo $b | grep "*)>nS4XkrlH @XUL"
$ echo "$b" | grep "*)>nS4XkrlH @XUL"
*)>nS4XkrlH @XUL
Первый grep
не совпадает ни с чем, кроме второго. Разница заключается в разделении слов в оболочке.