Передать аргументы функции?

Ваш диск имеет 1 текущий ожидающий сектор; Что означает, что сектор не может быть прочитан правильно. Обычно это аппаратная проблема, и приводит к неудачному чтению во время смарт-самопроверки. Если вы пишете этот сектор, он может либо «исправить» проблему, либо превращаться в перераспределенный сектор.

С тех пор технический привод уже потерял данные на данный момент, я бы больше не доверял этому для важных вещей.

0
26.01.2015, 22:28
1 ответ

Очень простой экстрактор именованных аргументов для Bash:

#!/bin/bash

getargs()
{
  local out=""
  for argname in "$@"; do
    out="${out}local $argname=\$1; shift;"
  done
  printf "%s" "$out"
}

testfun()
{
  eval $(getargs a b c)
  printf "a = %s, b = %s, c = %s\n" "$a" "$b" "$c"
}

testfun "$@"                                                                                                  

Поскольку мы хотим, чтобы аргументы были локальными переменными в динамической области действия функции testfun, getargsне может быть вызовом функции. Скорее, getargs— это крошечный компилятор , который переводит спецификацию аргумента, подобную a b c, в синтаксис оболочки , генерируя код, который в противном случае мы добавили бы вручную, чтобы получить позиционный аргумент. в локальные переменные.

Например, вывод

getargs a b c

исходный код:

local a=$1; shift;local b=$1; shift;local c=$1; shift

когда мы evalэто делаем, оно делает то, что кажется. В контексте вызывающего объекта он получает первые три позиционных аргумента в a, bи c, перемещая их из списка аргументов.

Теперь мы можем перейти на следующий уровень и добавить «прибамбасы».

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

Мы могли бы поддерживать необязательные аргументы:getargs a b : c(или что-то еще )может означать, что aи bявляются обязательными, но cявляется необязательным. Мы также могли бы поддерживать конечные аргументы:getargs a b : c. dи генерировать код, который получает первые два аргумента (, которые необходимы ), в локальные переменные aи b. Затем, если присутствует третий аргумент, он переходит в c.Любые аргументы после этого переходят в d, который является массивом Bash.

Я оставлю это в качестве упражнения.

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

Вы можете написать какой-нибудь препроцессор (, например. в Awk )для преобразования некоторого вида синтаксического сахара именованной функции в обычный код оболочки.

0
28.01.2020, 02:51

Теги

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