Цитирую.
В сценарии используйте "$1"
, а не просто $1
.
В командной строке используйте
./script '*(ontehu'
вместо
./script *(ontehu
./script.sh (abc
Это синтаксическая ошибка в грамматике оболочки.
./script.sh &&
Это заставляет оболочку думать, что в командной строке есть условное И, и она ожидает что-то в правой части оператора &&
.
./script.sh &abc
Это две команды :./script
, запущенные как фоновый процесс (с помощью &
), и команда abc
.
Во всех этих случаях аргумент должен быть заключен в (одинарные кавычки, в идеале, если вам не нужно, чтобы оболочка вставляла значение переменной оболочки, и в этом случае он должен быть заключен в двойные кавычки ).
Ваш сценарий:
if [[ $1 =~ ^[A-Za-z_]+$ ]]; then
echo it matches
else
echo does_not match
fi
Цитата$1
:
if [[ "$1" =~ ^[A-Za-z_]+$ ]]; then
echo it matches
else
echo does_not match
fi
Разрешить использование цифр в конце значения:
if [[ "$1" =~ ^[A-Za-z_][A-Za-z0-9_]+$ ]]; then
echo it matches
else
echo does_not match
fi
Правильно сообщайте об ошибках (это лишнее):
if [[ "$1" =~ ^[A-Za-z_][A-Za-z0-9_]+$ ]]; then
printf '"%s" is a valid variable name\n' "$1"
else
printf '"%s" is not a proper variable name\n' "$1" >&2
exit 1
fi
Вы не можете использовать init
. Это неправильная программа для работы.
Вам нужно -понять, что init
можно вызывать как обычную команду. Программы init
, в которых это верно/было истинным, не являются программой init
, которая у вас есть. Есть 4 init
программы, в которых ее можно вызвать как обычную команду, и вы не используете ни одну из них. Скорее вы используете BusyBox init
, который, если обнаружит, что он был вызван в системе не как процесс #1, распечатывает это сообщение и завершает работу. Он не имеет никакой функциональности, кроме как процесс #1.
В BusyBox также нет telinit
. Его init
не имеет клиент-серверного интерфейса через FIFO.
Чтобы завершить работу, вы должны сделать что-то, что в конечном итоге приведет к отправке SIGPWR
, SIGUSR1
, SIGUSR2
или SIGTERM
процессу #1. Обратите внимание, что, как и в случае с другими наборами инструментов управления системой, «однопользовательский -пользовательский режим» (неправильное название с 1995 года )не является целью отключения. В такой режим не выключаются, и BusyBox init
на самом деле не участвует в включении такого режима.
Скорее, в системах, использующих OpenRC поверх BusyBox init
, этот режим полностью относится к механизмам OpenRC. openrc single
меняется на ошибочный -названный «одиночный» режим. (Используя собственныйinit
OpenRC , который не подходит для вас, существует команда shutdown
, которая с ним общается. Но это всего лишь весьма окольный путь бега openrc single
, оказывается.)
Alpine Linux документирует устаревший OpenRC, примечание. Сам OpenRC больше не имеет каталога single
. Это было удалено в 2019 году . Кроме того, команда rc
была изменена на openrc
в 2014 году .