Как я могу получить значение ASCII алфавита?
Например, 97
для a
?
bash
bash-script
ascii
xmpirate
источник
источник
"'A"
правильно тогда , если вы используете"A"
это будет сказать:A: invalid number
. Кажется, это сделано на стороне printf (то есть в оболочке"'A"
действительно 2 символа, a'
и aA
. Они передаются в printf. А в контексте printf он преобразуется в значение ascii A, (и, наконец, печатается как десятичное число благодаря'%d'
. Используйте,'Ox%x'
чтобы показать его в гекса или'0%o'
чтобы иметь его в восьмеричном))printf "\\$(printf '%03o' "$1")"
,'%03o'
,LC_CTYPE=C
и апостроф в"'$1"
делах?Вы можете увидеть весь набор с:
Вы получите таблицы в восьмеричном, шестнадцатеричном и десятичном виде.
источник
Если вы хотите расширить его до символов UTF-8:
С
bash
,ksh
илиzsh
встроенные команды:источник
iceweasel
наDebian sid
. Шрифт, подтвержденный веб-консолью iceweasel, называется «DejaVu Sans», и у меня установлены пакеты ttf-dejavu ttf-dejavu-core ttf-dejavu-extra, которые поступают из Debian с апстримомctbl()
кажется, правильно дать мне возможность показать его и нарезать полукокс из головы колонны сprintf
, но она ставит4*((o1=360)>=(d1=240)|(o2=237)>=(d2=159)|(o3=230)>=(d3=152)|(o4=210)>=(d4=136))
в$OPTARG
для байтовых значений.Это хорошо работает,
в точности эквивалентно:
источник
echo -n
подавляет завершающийtr -d "\n"
echo
, не в Unix-совместимом эхо.printf %s A
будет портативным.Я собираюсь для простого (и элегантного?) Решения Bash:
В сценарии вы можете использовать следующее:
Обратите внимание на одинарную кавычку перед CharValue. Обязан ...
источник
printf "%d"
.Первый
ctbl()
- наверху - запускается только один раз. Он генерирует следующий вывод (который был отфильтрованsed -n l
для удобства печати) :... которые представляют собой 8-битные байты (меньше
NUL
) , разделенные на четыре строки в кавычках, разделенных равномерно по границам в 64 байта. Могут быть представлены строки с восьмеричной диапазоны нравится\200\1-\77
,\100-\177
,\200-\277
,\300-\377
, где байты 128 используются в качестве места для держателяNUL
.Первая
ctbl()
цель существования состоит в том, чтобы генерировать эти строки так, чтобы ониeval
могли определять вторуюctbl()
функцию, буквально встраивая их после этого. Таким образом, на них можно ссылаться в функции без необходимости генерировать их снова каждый раз, когда они необходимы. Когдаeval
определяет вторуюctbl()
функцию, первая перестает быть.Верхняя половина второй
ctbl()
функции здесь в основном вспомогательная - она предназначена для переносимой и безопасной сериализации любого текущего состояния оболочки, на которое она может повлиять при вызове. Верхний цикл будет заключать в кавычки любые значения переменных, которые он может захотеть использовать, а затем складывать все результаты в свои позиционные параметры.Первые две строки, тем не менее, сначала сразу возвращают 0 и устанавливают
$OPTARG
на то же самое, если первый аргумент функции не содержит хотя бы одного символа. И если это так, вторая строка сразу усекает свой первый аргумент только до первого символа - потому что функция обрабатывает только символ за раз. Важно, что он делает это в текущем контексте локали, что означает, что если символ может содержать более одного байта, то, если оболочка правильно поддерживает многобайтовые символы, она не будет отбрасывать никакие байты, кроме тех, которые отсутствуют в первый символ его первого аргумента.Затем он выполняет цикл сохранения, если это вообще необходимо, и после этого переопределяет текущий контекст локали в локаль C для каждой категории, присваивая
LC_ALL
переменную. С этого момента символ может состоять только из одного байта, и поэтому, если в первом символе его первого аргумента было несколько байтов, теперь каждый из них должен быть адресуемым как отдельный символ самостоятельно.Именно по этой причине вторая половина функции является
while
циклом , а не последовательностью с одиночным прогоном. В большинстве случаев он, вероятно, будет выполняться только один раз за вызов, но, если оболочка, в которойctbl()
он определен правильно, обрабатывает многобайтовые символы, он может зацикливаться.Обратите внимание, что приведенная выше
$(ctbl)
подстановка команд оценивается только один раз - поeval
первоначальному определению функции - и что навсегда после того, как этот токен заменяется литеральным выводом этой подстановки команд, сохраненным в памяти оболочки. То же самое верно для двухcase
подстановок команд шаблона. Эта функция никогда не вызывает subshell или любую другую команду. Он также никогда не будет пытаться читать или записывать ввод / вывод (за исключением случая с некоторым диагностическим сообщением оболочки - что, вероятно, указывает на ошибку) .Также обратите внимание, что тест на непрерывность цикла не просто
[ -n "$a" ]
, потому что, как я обнаружил, к сожалению, по какой-то причинеbash
оболочка делает:... и поэтому я явно сравниваю
$a
len с 0 для каждой итерации, что также необъяснимо ведет себя по-разному (читай: правильно) .В
case
проверяет первые байты для включения в любом из наших четырех строк и сохраняет ссылку на набор байте в$b
. После этого первые четыре позиционных параметра оболочки относятсяset
к строкам, встроеннымeval
и написаннымctbl()
предшественником.Затем, все, что осталось от первого аргумента, снова временно усекается до его первого символа - который теперь должен быть гарантированно одним байтом. Этот первый байт используется в качестве ссылки для удаления из хвоста строки, с которой он совпал, и ссылка в
$b
являетсяeval
'd для представления позиционного параметра, так что все, от байта ссылки до последнего байта в строке, может быть заменено. Три другие строки полностью исключаются из позиционных параметров.На данный момент значение байта (по модулю 64) может быть указано как длина строки:
Затем делается небольшая математика для согласования модуля, основанного на значении in
$b
, первый байт in$a
постоянно удаляется, и вывод для текущего цикла добавляется в стек в ожидании завершения, прежде чем цикл перезагружается, чтобы проверить,$a
действительно ли он пуст.Когда
$a
определенно пусто, все имена и состояния - за исключением$OPTARG
- что функция, на которую влияют в течение всего ее выполнения, восстанавливаются до своего предыдущего состояния - независимо от того, установлено ли оно, а не равно ли оно, установлено и равно нулю или не установлено - и выходные данные сохранены чтобы$OPTARG
как функция возвращается. Фактическое возвращаемое значение на единицу меньше, чем общее число байтов в первом символе его первого аргумента - поэтому любой однобайтовый символ возвращает ноль, а любой многобайтовый символ вернет больше нуля - и его формат вывода немного странный.Значение
ctbl()
экономит$OPTARG
является допустимыми оболочками арифметического выражения , которое, если оценено, будет одновременно установить имена переменных форм$o1
,$d1
,$o2
,$d2
в десятичное и восьмеричных значения всех соответствующих байт в первом символе первого аргумента, но в конечном счете оценить в общую сложности количество байтов в первом аргументе. Когда я писал это, у меня был особый вид рабочего процесса, и я думаю, что демонстрация в порядке.Я часто нахожу причину, чтобы разобрать строку
getopts
как:Я, вероятно, делаю немного больше, чем просто печатаю его символ в строке, но все возможно. В любом случае, я еще не нашел ,
getopts
что будет правильно делать (удар, -dash
«Sgetopts
делает его обугливается на гольца, но ,bash
безусловно , не делает) :Хорошо. Итак, я попытался ...
Этот тип рабочего процесса - байт для байта / символа для типа символа - это тот, который я часто использую при выполнении tty. На переднем крае ввода вам нужно знать значения символов, как только вы их читаете, и вам нужны их размеры (особенно при подсчете столбцов) , и вам нужно, чтобы символы были целыми символами.
И вот теперь у меня есть
ctbl()
:Обратите внимание, что на
ctbl()
самом деле$[od][12...]
переменные не определяются - они никогда не оказывают какого-либо длительного влияния на любое состояние, но$OPTARG
- но только помещают строку,$OPTARG
которая может быть использована для их определения, - так я получаю вторую копию каждого символа выше, выполняя,printf "\\$o1\\$o2"
потому что они устанавливаются каждый раз, когда я оцениваю$(($OPTARG))
. Но где я это делаю я также объявить длину поля модификаторprintf
«s%s
формат строки аргумента, и потому , что выражение всегда вычисляется на общее число байтов в характере, я получаю весь характер на выходе , когда я делаю:источник
[ "$(printf \\1)" ]|| ! echo but its not null!
же, не стесняйтесь лучше познакомиться с практикой значимых комментариев, если вы не порекомендуете действительно такой конкурс ...?sh
командный язык POSIX .bash
является Борн снова supraset в том же самом, и в значительной степени крутого мотиватора для большей части ухода , обеспечиваемого выше по отношению к широко портативным, уверенным расширению и пространству имен почетно размерам символов любого рода.bash
Я должен был уже справиться с большей частью этого, ноc
языкprintf
был, и, возможно, имеет недостатки вышеупомянутых возможностей.Не скрипт оболочки, но работает
Образец вывода
источник
konsole
xxd<press enter>
<SHIFT+INSERT><CTRL+D>
вы получите что-то вроде:
Вы знаете, что символ, который вы вставили, имеет шестнадцатеричный код
0xfb
источник