Ключевое различие между этими двумя последовательностями команд заключается в том, что вторая содержит 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 не совпадает ни с чем, кроме второго. Разница заключается в разделении слов в оболочке.