ошибка оболочки busybox: строка 9 (левая квадратная скобка): не найдено

У меня есть следующий код, и я получаю строку ошибки 9: [: не найдено:

#!/bin/sh
msg=$(dmesg | tail -n1)
echo "$msg"
if [ "$msg" = "Tasklet grp12" ]
then
    echo "Test was successful, Strings are equal."
else
    echo "Test failed, Strings are not equal."
fi

person Simon Rechermann    schedule 08.01.2021    source источник
comment
Похоже, это не тот код, который вызывает вашу ошибку, поскольку строки не совпадают.   -  person Benjamin W.    schedule 08.01.2021
comment
[, как и любая другая команда, Busybox может встроить в свой единственный двоичный файл с самовызовом параметр времени компиляции.   -  person Charles Duffy    schedule 08.01.2021
comment
Убедитесь, что ваш сценарий не содержит скрытых символов и не использует двойники Unicode; но как только это будет сделано, возможно, пора выяснить, как была скомпилирована ваша конкретная копия busybox.   -  person Charles Duffy    schedule 08.01.2021
comment
@CharlesDuffy busybox позволяет отключить команду (или, по крайней мере, потребовать, чтобы она отображалась как внешняя команда)? Я перестану шутливо предполагать, что [ не должно существовать.   -  person chepner    schedule 08.01.2021
comment
@SimonRechermann, между прочим, dmesg | tail -n1 требует, чтобы dmesg записывал все свои выходные данные в FIFO, после чего tail считывает все эти строки и копирует последнюю. Если, напротив, у вас есть что-то вроде /var/log/dmesg (как обычный файл с возможностью поиска), tail -n1 /var/log/dmesg может пропустить прямо в конец файла и прочитать только последний блок, и, таким образом, может работать быстрее.   -  person Charles Duffy    schedule 08.01.2021
comment
'unlink $(what [)' должен отключить апплет busybox во время выполнения.   -  person alecxs    schedule 20.01.2021


Ответы (1)


спасибо Чарльзу Даффи! Мне пришлось установить флажок Встроенная версия «теста» в разделе оболочки меню make menuconfig в busybox, чтобы включить сравнение строк. Теперь код работает. Поскольку я активировал grep, я сначала попробовал другое решение, которое также работало, но наверняка имело плохую производительность:

#!/bin/sh
msg=$(dmesg | tail -n1)
echo "$msg"
tasklet="Tasklet grp12"
if ( echo "$msg" | grep "^$tasklet$" )
then
    echo "Test was successful, Strings are equal."
else
    echo "Test failed, Strings are not equal."
fi
person Simon Rechermann    schedule 09.01.2021