«Ожидается двоичный оператор», потому что вы вызываете команду [
с аргументами «grep» и «-q» (вы вообще не вызываете grep), а [
ожидает двоичный оператор, в котором выуказали -q
.[
- это команда, которая обрабатывается не иначе, как grep
или ls
или cat
.Лучше (IMO) записать его по буквам test
, и при вызове с именем test
не требуется, чтобы его последний аргумент был ]
.Если вы хотите использовать grep
в операторе if, просто сделайте что-то вроде:
if echo "$username" | grep -q "|0510"; then ...
(хотя я подозреваю, что в зависимости от контекста существуют более эффективные способы достижения вашей цели.)
Основной синтаксис оператора if - if pipeline; then...
.В общем случае конвейером является простая команда test
, и в какой-то момент в предыстории было принято решение предоставить имя [
для команды test
с дополнительным предупреждением о том, что ее последний аргумент долженбыть ]
.Я считаю, что это было сделано для того, чтобы операторы выглядели более естественными, как если бы [
был оператором в языке.Просто игнорируйте [
и всегда используйте test
, и вы избежите путаницы.