Как именно исправление ошибок работает в дистрибутиве? upstream vs downstream

  • (...) скобки указывают на под-оболочку. То, что находится внутри них, не является выражением, как во многих других языках. Это список команд (как и вне скобок). Эти команды выполняются в отдельном подпроцессе, поэтому любое перенаправление, присвоение и т.д., выполненное внутри круглых скобок, не имеет эффекта за пределами круглых скобок.
    • С ведущим знаком доллара, $(...) - это подстановка команды: внутри круглых скобок находится команда, и вывод команды используется как часть командной строки (после дополнительных расширений, если подстановка не находится между двойными кавычками, но это другая история).
  • { ... } скобки похожи на круглые скобки тем, что группируют команды, но они влияют только на синтаксический разбор, а не на группировку. Программа x=2; { x=4; }; echo $x печатает 4, тогда как x=2; (x=4); echo $x печатает 2. (Также скобки, являющиеся ключевыми словами, должны быть разграничены и находиться в командной позиции (отсюда пробел после { и ; перед }), тогда как круглые скобки - нет. Это просто причуда синтаксиса).
    • С ведущим знаком доллара, ${VAR} - это расширение параметра, расширяющееся до значения переменной, с возможными дополнительными преобразованиями. Оболочка ksh93 также поддерживает ${ cmd;} как форму подстановки команды, которая не порождает под-оболочку.
  • ((...)) двойные скобки окружают арифметическую инструкцию, то есть вычисления над целыми числами, с синтаксисом, напоминающим другие языки программирования. Этот синтаксис в основном используется для присваиваний и в условных выражениях. Он существует только в ksh/bash/zsh, но не в обычном sh.
    • Тот же синтаксис используется в арифметических выражениях $((...)), которые расширяются до целочисленного значения выражения.
  • [ ... ] одинарные скобки окружают условные выражения. Условные выражения в основном строятся на операторах, таких как -n "$variable" для проверки пустоты переменной и -e "$file" для проверки существования файла. Обратите внимание, что вокруг каждого оператора нужен пробел (например, [ "$x" = "$y" ], а не [ "$x"="$y" ]), а также пробел или символ типа ; как внутри, так и вне скобок (например. например, [ -n "$foo" ], а не [-n "$foo"]).
  • [[ ... ]] двойные скобки - это альтернативная форма условных выражений в ksh/bash/zsh с несколькими дополнительными возможностями, например, вы можете написать [[ -L $file && -f $file ]] для проверки, является ли файл символической ссылкой на обычный файл, тогда как одинарные скобки требуют [ -L "$file" ] && [ -f "$file" ]. Подробнее об этом см. в Почему расширение параметров пробелами без кавычек работает внутри двойных скобок [[, но не одинарных скобок [?.
  • В оболочке каждая команда является условной командой: каждая команда имеет статус возврата, который либо равен 0, что означает успех, либо целое число от 1 до 255 (и потенциально больше в некоторых оболочках), что означает неудачу. Команда [ ... ] (или [[ ... ]]) - это определенная команда, которая также может быть написана как test ..., и достигает успеха, если файл существует, или если строка непустая, или если число меньше другого и т. д. Синтаксическая форма ((...)) приводит к успеху, если число ненулевое. Вот несколько примеров условных выражений в сценарии оболочки:

    • Проверьте, содержит ли myfile строку hello:

      if grep -q hello myfile; then ...
      
    • Если mydir - это каталог, перейдите в него и сделайте что-нибудь:

      if cd mydir; then
       echo "Создается mydir/myfile"
       echo 'some content' >myfile
      else
       echo >&2 "Фатальная ошибка. Этот сценарий требует, чтобы mydir существовал."
      fi
      
    • Проверка наличия файла с именем myfile в текущем каталоге:

      if [ -e myfile ]; then ...
      
    • То же самое, но с учетом висячих символических ссылок:

      if [ -e myfile ] || [ -L myfile ]; then ...
      
    • Проверьте, что значение x (которое предполагается числовым) не меньше 2, переносимо:

      if [ "$x" -ge 2 ]; then ...
      
    • Проверьте, является ли значение x (которое предполагается числовым) не менее 2, в bash/ksh/zsh:

      if ((x >= 2)); then ...
      
5
30.10.2015, 20:25
0 ответов

Теги

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