Переменное присвоение за пределами оператора выбора

RLIMIT_NPROC не управляет числом детей, которых может иметь процесс.

Это управляет общим количеством процессов, которые может иметь пользователь. Строго говоря, поскольку это - установка для каждого процесса, когда ветвление (), клон (), vfork (), и т.д. называет процесс, значение RLIMIT_NPROC для того процесса сравнивается с общим процессом, значат родительского пользователя того процесса, не к числу детей, которых имеет процесс.

8
01.08.2014, 01:35
2 ответа

Конструкция variable = $ (...) примет стандартный вывод любой команды из $ (...) и назначит это в переменную . Таким образом, чтобы получить переменную , назначенную желаемым образом, значения должны быть отправлены на стандартный вывод. Это легко сделать с помощью команды echo :

color_code=$(case "$COLOR" in
  red)    echo 1;;
  yellow) echo 2;;
  green)  echo 3;;
  blue)   echo 4;;
esac)

Это будет работать с bash , а также со всеми другими оболочками POSIX.

Необязательные левые символы

Согласно стандарту POSIX, левая скобка в операторе case является необязательной, и также работает следующее:

color_code=$(case "$COLOR" in
  (red)    echo 1;;
  (yellow) echo 2;;
  (green)  echo 3;;
  (blue)   echo 4;;
esac)

Как указывает Жиль в комментариях, не все оболочки принимают обе формы в сочетании с $ (...) : впечатляюще подробную таблицу совместимости см. в "$ ()" подстановка команд против встроенных ")" .

6
27.01.2020, 20:12

color_code=$(...) назначает вывод команды ... переменной color_code, при этом окончательные строки удаляются. Так что вам нужно произвести некоторый вывод. Код, который вы написали, пытается выполнить 1 в качестве команды.

Вы можете использовать эту идиому. Обратите внимание, что color_code будет пустым, если $COLOR не является ни одним из поддерживаемых значений.

color_code=$(case "$COLOR" in
  (red)    echo 1;;
  (yellow) echo 2;;
  (green)  echo 3;;
  (blue)   echo 4;;
esac)

Но это не очень идиоматично. Язык оболочки ориентирован на простые комбинации простых команд. Эта большая подстановка команд является неудобной. Подстановка команд создает подоболочку, что медленнее, чем простой метод:

case "$COLOR" in
  red)    color_code=1;;
  yellow) color_code=2;;
  green)  color_code=3;;
  blue)   color_code=4;;
esac

Главное семантическое различие между двумя подходами заключается в том, что $(...) создает подоболочку, так что любое присваивание, выход, перенаправление и т.д., выполняемое внутри, не имеет никакого эффекта снаружи.

2
27.01.2020, 20:12

Теги

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