Создание функции, которая выводит имя переменной и ее значение

Байты не являются символами, а символы не являются байтами. Соответствие между символами и байтами зависит от локали. В локали UTF-8 символ будет представлен двумя байтами, \xC2\x89 (194 и 137 в десятичной системе); пустой байт со значением \x89 (137 в десятичной системе) будет недействительным. Как вводить символы, которые не отображаются на клавиатуре, зависит от терминала и среды рабочего стола.

Если все, что вам нужно, это отправить произвольный байт в программу, вы можете использовать pipe, например:

$ echo -ne '\x89' | hexdump -C
00000000  89                                                |.|
00000001
7
11.03.2017, 01:04
2 ответа

Используйте ${!имя_переменной}:

function superEcho
{
    printf '%s: %s\n' "$1" "${!1}"
}
2
27.01.2020, 20:17

POSIXly:

superEcho() {
  eval 'printf "%s\n" "$1: ${'"$1"'}"'
}

Как и для bash, специфичного для ${!var}, который ожидает, что $1 был очищен и содержит допустимое имя переменной . В противном случае это равносильно уязвимости, связанной с внедрением произвольных команд.

Вы можете выполнить санацию в функции:

superEcho() {
  case $1 in
    ("" | *[!_0-9abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]* | [0-9]*)
      printf >&2 'Invalid variable name: "%s"\n' "$1"
      return 1;;
    (*) eval 'printf "%s\n" "$1: ${'"$1"'}"'
  esac
}

Обратите внимание, что для переменных типа массив или ассоциативный массив в bash или ksh (POSIX sh не имеет массива, кроме "$@", который вы не можете использовать здесь, так как это будут аргументы функции superEcho сам), который печатает только значение элемента индекса 0, тогда как в zsh это выводит конкатенацию значений с первым символом $IFS (и с символами SPC в yash).

В ksh, zsh, bash или yash (четыре борнеподобных оболочки с поддержкой массивов). См. также typeset -p var для печати определения и атрибутов переменной.

8
27.01.2020, 20:17

Теги

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