проверка аргумента сценарию удара является строкой всех цифр

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

В соответствии с Linux, программы пространства пользователя всегда были выгружаемы: ядро прерывает программы пространства пользователя для переключения на другие потоки, с помощью регулярного такта системных часов. Так, ядро не ожидает программ пространства пользователя для явного выпуска процессора (который имеет место в кооперативной многозадачности). Это означает, что бесконечный цикл в программе пространства пользователя не может заблокировать систему.

Однако до 2,6 ядер, само ядро не было выгружаемо: как только один поток ввел ядро, он не мог быть вытеснен для выполнения другого потока. Однако это отсутствие вытеснения в ядре вызвало несколько проблем относительно задержки и масштабируемости. Так, вытеснение ядра было представлено в 2,6 ядрах, и можно включить или отключить его с помощью опции CONFIG_PREEMPT. Если CONFIG_PREEMPT включен, то код ядра может быть вытеснен везде, кроме тех случаев, когда код отключил локальные прерывания. Бесконечный цикл в коде больше не может блокировать всю систему. Если CONFIG_PREEMPT отключен, то 2,4 поведения восстанавливаются.

ReQuoted и отформатированный от: http://www.linuxquestions.org/questions/linux-general-1/pre-emptive-vs-non-pre-emptive-kernel-582437/

4
29.04.2011, 00:37
3 ответа

Почему Вы звоните sh, если это - сценарий удара? Ясно это в Вашей системе, sh не удар, но некоторая другая оболочка в семействе Границ/POSIX. На самом деле это - тире, меньшая оболочка, разработанная для низкого потребления памяти и скорости, которая в значительной степени только поддерживает конструкции POSIX и встроенные утилиты.

[[ … ]] ksh расширение синтаксиса Bourne, который был взят ударом и zsh, но не POSIX. В портативном сценарии необходимо использовать [ … ] для тестов. Стандартная конструкция не имеет никакой поддержки сопоставления с образцом; стандартная идиома должна использовать a case конструкция:

case $1 in                        # branch to the first pattern that $1 matches
  *[!0-9]*)                       # pattern = anything containing a non-digit
    echo not a number             # do this if the first pattern triggered
    ;;                            # end of this case branch
  *)                              # pattern = anything (else)
    echo successor of $(($1-1))   # do this if the second pattern triggered
    ;;                            # end of this case branch
esac                              # end of the case construct

Вот функция, которая тестирует, если ее аргументом являются все-цифры:

is_all_digits () {
  case $1 in *[!0-9]*) false;; esac
}

Отклонение: Я первоначально сделал опечатку в отрывке выше: я записал $(($0-1)). Это вызвало нечетно выглядящие сообщения об ошибках:

$ ash foo.sh 42
foo.sh: 4: arithmetic expression: expecting EOF: "foo.sh-1"
$ ash ./foo.sh 42
./foo.sh: 4: arithmetic expression: expecting primary: "./foo.sh-1"
$ ksh ./foo.sh 42
./foo.sh: line 3: foo.sh: invalid variable name
$ pdksh ./foo.sh 42
./foo.sh[4]: ./foo.sh-1: unexpected `.'
$ bash foo.sh 42         
foo.sh: line 3: foo.sh-1: syntax error: invalid arithmetic operator (error token is ".sh-1")
$ bash ./foo.sh 42
./foo.sh: line 3: ./foo.sh-1: syntax error: operand expected (error token is "./foo.sh-1")
$ zsh foo.sh 42
foo.sh:3: bad floating point constant

$0 название сценария, таким образом, арифметическое выражение, которое будет оценено, было foo.sh-1 или ./foo.sh-1. Можно наблюдать разнообразие ошибочных сообщений среди оболочек. Я был немного удивлен видеть что сообщения пепла и сообщение удара без ./ были самыми ясными: ни одна из других оболочек не упоминает, что проблема находится в арифметическом выражении. Пепел и pdksh действительно понимают прикрепленные мысли для создания отчетов об ошибке одна строка слишком далеко.

9
27.01.2020, 20:47
  • 1
    @Gilles: я использую sh для сценария удара, потому что я - идиот.:-) Так оба [[ ]] и [ ] работа для тестов в ударе, но в целом только [ ] работы? –  Faheem Mitha 29.04.2011, 00:42
  • 2
    @Faheem: Bash/ksh/zsh имеют обоих [[ и [, другие оболочки имеют только [. [[ и [ у имей много общих операторов, но [[ специальная конструкция оболочки тогда как [ должен соблюсти нормальные правила заключения в кавычки. –  Gilles 'SO- stop being evil' 29.04.2011, 00:48
  • 3
    @Gilles: С Вашим альтернативным синтаксисом выше, я добираюсь: $ sh foo.sh 100 foo.sh: 4: arithmetic expression: expecting EOF: "foo.sh-1". Можно ли сломать синтаксис в вышеупомянутом отрывке оболочки немного для нас неграмотные? –  Faheem Mitha 29.04.2011, 00:51
  • 4
    @Faheem: Опечатка, посмотрите мое редактирование. Сценарий взял правильное ответвление случая, но затем арифметическое выражение $(($0-1)) разбомбивший, потому что $0 (название сценария) не, смотрел ничто как число. Только для забавы, попробуйте исходную версию названным сценарием 2+2 или '' (пространство). Для дополнительного кредита попытайтесь назвать сценарий - (единственный тире), в различных оболочках. –  Gilles 'SO- stop being evil' 29.04.2011, 01:11
  • 5
    @Gilles:Ясно. мне не нужны строки эха, правильно? Таким образом, я могу сделать case $1 in *[!0-9]*) exit 1;; esac. Я вижу, что gnu.org/software/bash/manual/bash.html#Conditional-Constructs имеет раздел по случаю. возможно, добавьте эту ссылку, если Вы не можете найти лучший? Таким образом, это соответствует аргументу против regex *[!0-9]*? И * строка, которую я принимаю, выполняется, если все соответствия перестали работать, хотя я не знаю что * обозначает здесь. –  Faheem Mitha 29.04.2011, 01:38

Попытайтесь выполнить его с bash foo.sh bar. Если Ваша попытка записать сценарий удара, необходимо использовать удар. [[И]] используемый выше находятся только в ударе, который является производной Оболочки Bourne. sh означает Оболочку Bourne и не может совпасть с ударом. Я думаю тире использования debian для sh. Если Вы вместо этого хотите изучить, как записать портативные сценарии Оболочки Bourne, которые не требуют удара определенные функции, можно переписать то использование grep вместо этого:

if echo "$foo" | grep '^[0-9][0-9]*$' >/dev/null 2>&1; then
    echo "'$1' has a non-digit somewhere in it"
    exit 1
else
    echo "'$1' is strictly numeric"
fi
3
27.01.2020, 20:47
  • 1
    grep -v '[^0-9]', или expr, или лучше, a case выражение. –  Gilles 'SO- stop being evil' 29.04.2011, 00:37
  • 2
    Вздох. Я всегда использую sh для мобильности, но забыл, что этот код не был портативным. Спасибо за разъяснение. –  Faheem Mitha 29.04.2011, 00:40
  • 3
    Bash не является Оболочка Bourne derivateно переопределение с главным образом Оболочкой Bourne как поведение. Korn Shellс другой стороны истинная производная Оболочки Bourne, когда David Korn запустил свою разработку с источника Оболочки Bourne. –  schily 06.09.2015, 16:37

Я предлагаю использовать expr потому что это совместимо POSIX:

if [ "$(expr "$1" : '^[0-9]\+$')" = "0" ]; then
    echo "'$1' has a non-digit somewhere in it"
    exit 1
else
     echo "'$1' is strictly numeric"
fi
0
27.01.2020, 20:47
  • 1
    Это, кажется, не работает. Я добираюсь sh foo.sh 111 -> '111' has a non-digit somewhere in it –  Faheem Mitha 29.04.2011, 11:43
  • 2
    @faheem-mitha я обновил ответ. –  php-coder 29.04.2011, 16:58
  • 3
    case также совместимо POSIX, и это - оболочка встроенная конструкция. Если Вы настаиваете на том, чтобы использовать expr (Я не могу думать о серьезном основании где case достаточно, т.е. можно суметь обойтись подстановочными знаками), используйте его результат возврата: if expr "$1" : '[0-9]*' >/dev/null; then … Обратите внимание также, что Ваш regexp не является портативным: expr соответствия всегда привязываются, и некоторая обработка реализаций ^ и $ буквально. –  Gilles 'SO- stop being evil' 29.04.2011, 21:08
  • 4
    upvoted., жаль о длительной задержке, я забыл об этом вопросе. Если Вы заботитесь, вставляете ссылку о expr использование. Я не думаю, что никогда не использовал его. –  Faheem Mitha 15.05.2011, 20:03

Теги

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