2016-08-31 7 views
1

Я пытаюсь получить сценарий оболочки, написанный для busybox на одном из наших встроенных устройств. Ниже приведена строка, которая вызывает проблемы, и я включил вывод ее работы в оболочку с флагом -x.Что не так с этой командой оболочки

if [ cut -d : -f 1-3 /sys/class/net/eth0/address | grep -q -i 01:02:03 ]; then 
    # Do stuff 
fi 

Вывод, который дается при попытке запустить его:

# sh -x ./script 
+ [ cut -d : -f 1-3 /sys/class/net/eth0/address 
sh: missing ] 
+ grep -q -i 01:02:03 ] 
grep: ]: No such file or directory 
+ sync 

я первоначально не писать сценарий, так что я не знаю, когда он перестал работать. Похоже, что команда, которая используется для сравнения (должна возвращать 1, если префикс MAC-адреса соответствует указанному образцу, 0 в противном случае) выполняется неправильно, но я не знаю, почему он пытается отделить команды от команды ,

+2

Это условие 'if' никогда бы не сработало. 'cut' - это команда для себя, это не опция для команды' ['. Если вы хотите использовать конвейер команд как условие для 'if', просто отпустите квадратные скобки. И в системе без занятости, «человеческий тест» для дальнейшей мудрости. – ghoti

ответ

7

Проблема заключается в том, что вы используете [, как если бы это был синтаксис, тогда как в оболочке это команда, которая требует передачи определенных аргументов.

Я думаю, что исправление должно быть так же просто, как удаление [ и соответствующий ] (который является последним аргументом, что [ ожидает):

if cut -d : -f 1-3 /sys/class/net/eth0/address | grep -q -i 01:02:03; then 

В оболочке, if работы, глядя на код возврата команды, будь то [ или любой другой.

Кстати, я не думаю, что опция -i для grep делает что-нибудь полезное в этом случае, поэтому вы можете ее удалить.


Обратите внимание, что ваше состояние может быть упрощена (благодаря chepner):

if grep -q '^01:02:03(:|$)' /sys/class/net/eth0/address; then 

соответствует началу строки, а затем часть, которую вы уже были, а затем либо двоеточие, либо в конце линии.

В качестве альтернативы:

if [ "$(cut -d : -f 1-3 /sys/class/net/eth0/address)" = 01:02:03 ]; then 

ли прямое сравнение строк на выходе команды разреза, а не обжигающе к Grep.

+0

Пробовал, работает как шарм. Благодаря! – RobbG

+1

Команда 'cut' сама по себе не нужна, либо:' if grep -q '^ 01: 02: 03 (: | $)'/sys/class/net/eth0/address; то «было бы достаточно. – chepner

+1

Или удалите 'grep' в пользу простого сравнения текста:' if ["$ (cut -d: -f 1-3/sys/class/net/eth0/address)" = 01:02:03]; затем'. – chepner

Смежные вопросы