Проверка, является ли строка числом

Предположим, Linux

Я изучал нечто подобное несколько лет назад. Вопрос, на который я не могу ответить, заключается в том, будет ли сеть по-прежнему доступна в нужное время.

Чтобы на самом деле отключить питание, вместо того, чтобы пытаться подключиться к SystemD или sysvinit, вы действительно должны попытаться подключиться к ядру напрямую с модом ядра.

Когда я искал эту тему, я в конце концов нашел некоторую информацию здесь:Как работает системное отключение ядра Linux внутри?

Это привело меня к коду ядра здесь :https://elixir.bootlin.com/linux/v5.0.5/source/arch/arm64/kernel/process.c#L136

void machine_power_off(void)
{
    local_irq_disable();
    smp_send_stop();
    if (pm_power_off)
        pm_power_off();
}

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


Выключение системы может еще больше зависеть от системы. Возможно, самым простым способом было бы вызвать существующую программу командной строки, такую ​​как sutdownили poweroff.

2
05.06.2020, 17:52
1 ответ

Проверка, является ли строка числом

Для этого не нужны регулярные выражения. Используйте оператор caseдля сопоставления строки с шаблонами подстановочных знаков :. Они менее эффективны, чем регулярное выражение, но здесь их достаточно. См. Почему мое регулярное выражение работает в X, но не в Y? если вам нужно краткое описание того, чем шаблоны подстановочных знаков (подстановочные знаки )отличаются от синтаксиса регулярных выражений. Это работает в любой реализации sh (, даже до -POSIX Bourne ).

case $var in
  '' | *[!0123456789]*) echo >&2 "This is not a non-negative integer."; exit 2;;
  [!0]*) echo >&2 "This is a positive integer. I like it.";;
  0*[!0]*) echo >&2 "This is a positive integer written with a leading zero. I don't like it."; exit 2;;
  *) echo >&2 "This number is zero. I don't like it."; exit 2;;
esac

Мобильность оболочки

В любой системе Unix есть реализация sh. Любая не -устаревшая система Unix или POSIX имеет реализацию sh, которая (в основном )соответствует спецификации POSIX . Обычно это /bin/sh, но есть несколько коммерческих уник, где /bin/sh— старинная оболочка Борна, а современная POSIX sh — в /usr/posix/bin/shили что-то в этом роде.

Используйте #!/usr/bin/env shв качестве линии шебанга для практической портативности, если #!/bin/shвам не подходит.

[[ … ]]недоступен в POSIX sh. Он доступен в ksh93, mksh, bash и zsh, но не в dash (популярном /bin/shв Linux )или BusyBox (популярном /bin/shво встроенном Linux ). Portable sh не имеет встроенного сопоставления регулярных выражений, только сопоставление с подстановочными знаками. Вы можете использовать grep, awk или sed, чтобы получить соответствие регулярным выражениям в системе POSIX.

Цитирование регулярного выражения для=~

Ksh93, bash и zsh имеют оператор сопоставления регулярных выражений =~в [[ … ]]условных выражениях. У них немного другие правила цитирования.

В bash ≥3.1,символы регулярных выражений имеют особый эффект справа от оператора =~, только если они не заключены в кавычки. Таким образом, [[ 100 =~ ^[1-9][0-9]*$ ]]верно, но [[ 100 =~ '^[1-9][0-9]*$' ]]ложно([[ $x =~ '^[1-9][0-9]*$' ]]соответствует только строкам, в которых ^[1-9][0-9]*$является подстрокой ).

В ksh 93u эффект заключения символа в кавычки в регулярном выражении зависит от символа :символы, которые также являются подстановочными знаками, не должны заключаться в кавычки, но символы, которые не являются символами, могут быть заключены в одинарные или двойные кавычки (но без обратной косой черты ). Таким образом, [[ 100 =~ ^[1-9][0-9]*$ ]]верно, как и [[ 100 =~ '^'[1-9][0-9]*'$' ]], но [[ 100 =~ '^[1-9][0-9]*$' ]]ложно (соответствует чему угодно с подстрокой [1-9][0-9]*), а [[ 100 =~ ^[1-9][0-9]*\$ ]]также ложно (соответствует любой строке, начинающейся с ненулевой цифры, затем еще цифры и$).

В zsh любой символ регулярного выражения может быть заключен в кавычки или нет. Обратите внимание, что это означает, что для буквального включения символа вам нужны два уровня цитирования, например. \\*или '\*'для соответствия звездочке. Итак, и [[ 100 =~ ^[1-9][0-9]*$ ]], и [[ 100 =~ '^[1-9][0-9]*$' ]]верны.

Я думаю, что помещение регулярного выражения в переменную — самый надежный способ не зависеть от особенностей оболочки.

regex='…' # Use extended regular expression syntax here, with '\'' if you need a literal apostrophe
if [[ $string =~ $regex ]]; …

диапазоны в выражениях регулярных выражений/подстановочных скобок

То, какие диапазоны, такие как [0-9], совпадают, зависит от реализации и локали. В общем, вы не можете ожидать, что он будет совпадать только с 0123456789 (, хотя вы должны быть в состоянии предположить, что он совпадет с по крайней мере те ). Если важно, чтобы вы совпадали только с 0123456789, избегайте диапазонов и называйте символы по отдельности.

3
18.03.2021, 23:30

Теги

Похожие вопросы