Байты не являются символами, а символы не являются байтами. Соответствие между символами и байтами зависит от локали. В локали UTF-8 символ
будет представлен двумя байтами, \xC2\x89
(194 и 137 в десятичной системе); пустой байт со значением \x89
(137 в десятичной системе) будет недействительным. Как вводить символы, которые не отображаются на клавиатуре, зависит от терминала и среды рабочего стола.
Если все, что вам нужно, это отправить произвольный байт в программу, вы можете использовать pipe, например:
$ echo -ne '\x89' | hexdump -C
00000000 89 |.|
00000001
Используйте ${!имя_переменной}
:
function superEcho
{
printf '%s: %s\n' "$1" "${!1}"
}
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
для печати определения и атрибутов переменной.