Печатая десятичное число к символу ASCII, моя команда не производит, как предназначено

Использование Red Hat bash как его оболочка; AIX будет использовать измененную Оболочку Bourne коммерческого UNIX или различный устаревший (и багги) версии ksh в зависимости от версии (с AIX 4, это был любой багги ksh88 или ошибочный клон этого). Если Вы захотите клавиши со стрелками, то необходимо будет работать ksh или bash (и если ksh на той версии AIX все еще пред -ksh93, клавиши со стрелками не будут работать, хотя Ctrl + P / Ctrl + N будет).

Клавиша Backspace, не работающая, является признаком stty причем настройки неправильные; Linux обычно предпочитает DEL для клавиши Backspace, но AIX использует Систему III/V стандартных Ctrl + H по умолчанию. Попробовать stty sane; tset -Q. (Это может все еще оставить его в ^H, в этом случае Вам будет нужно stty erase '^?'.), В то время как Вы в нем, удостовериться $TERM корректно (это должно обычно быть xterm или xterm-color; если последний не работает, используйте первого).

14
13.04.2017, 15:37
4 ответа

Вы не можете непосредственно распечатать коды ASCII при помощи printf "%c" $i как в C.

Необходимо сначала преобразовать десятичное значение меня в его восьмеричное значение, и затем необходимо распечатать его использование использования printf и помещение \ перед их соответствующими восьмеричными значениями.

Распечатать A, необходимо преобразовать десятичные 65 в восьмеричный, т.е. 101, и затем необходимо распечатать то восьмеричное значение как:

printf "\101\n"

Это распечатает A.

Таким образом, необходимо изменить его к:

for i in `seq 32 127`; do printf \\$(printf "%o" $i);done;

Но при помощи awk можно непосредственно распечатать как на языке C

awk 'BEGIN{for(i=32;i<=127;i++)printf "%c",i}';echo
13
27.01.2020, 19:51
  • 1
    В bash и zsh это может быть сделано без цикла и без внешней команды: printf $(printf '\%o' {32..127}). –  manatwork 04.08.2012, 15:02
  • 2
    @manatwork: ya точно.. большое спасибо за указание на него.. –  pradeepchhetri 04.08.2012, 15:08
  • 3
    @pradeepchhetri: Спасибо за подробный ответ и это, казалось, покрывало большинство необходимых деталей (следовательно, я выбираю Ваш ответ). Однако я предполагаю, что это пропустило важную информацию, которая может быть найдена в следующем сообщении в unix.derkeiler.com/Newsgroups/comp.unix.shell/2007-07 / …. Это указывает, что "Операнды аргумента нужно рассматривать как строки, если соответствующий спецификатор преобразования будет b, c, или s..." –  Ifthikhan 04.08.2012, 21:11
  • 4
    Не (char)(127) возвратитесь или что-то как этот. Независимо от того, что это, это появляется как одно из шестнадцатеричных полей или независимо от того, что их называют. Если Вы хотите только "печатаемое" (т.е. читаемый), просто перейдите в 126. Кроме того, хорошая мысль с восьмеричным. Это умно; я думал с точки зрения шестнадцатеричного (как printf '\x%x; {32..126} ... или 127, я предполагаю, так как все Вы сделали это, также), но это не работает. Восьмеричный спасает положение!:) Наконец, @Ifthikhan, я не уверен, что Вы имеете в виду. awk часто команды C-стиля использования и больше нигде %c б/У. Используя восьмеричные числа отличается, чем использование однобайтовых символов. –  Dylan 20.11.2014, 16:31

%c Интерпретирует связанный аргумент как символ: только первый символ данного аргумента печатается

У Вас, кажется, уже есть способ распечатать их, но вот один вариант.

for i in `seq 32 127`; do printf "\x$(printf "%x" $i) $i"; done
3
27.01.2020, 19:51

Вам нужно printf, но только один раз; вы можете заменить одно использование printfболее простым и эффективным echoплюс escape-последовательности Bash:

С шестнадцатеричными числами:

for i in `seq 32 127`; do
  echo -ne \\x$(printf %02x $i)
done

С восьмеричными числами:

for i in `seq 32 127`; do
  echo -ne \\0$(printf %03o $i)
done
1
27.01.2020, 19:51

Если вы, как и я, предпочитаете, чтобы строка формата printfоставалась как можно более постоянной, измените:

for i in `seq 32 127`; do printf "\\$(printf %o "$i")"; done
for i in `seq 32 127`; do printf "\x$(printf %x "$i")"; done  # not POSIX

-

for i in `seq 32 127`; do printf %b "\0$(printf %o "$i")"; done
for i in `seq 32 127`; do printf %b "\x$(printf %x "$i")"; done  # not POSIX

(Между прочим, стандарт POSIX дляprintfне включает \xсреди escape-последовательностей, разрешенных в строке формата.)

Я предпочитаю сохранять строку формата printfкак можно более постоянной из-за разделения задач. Проблема строки формата заключается в форматировании; аргументы для данных, которые варьируются. Также проблема может возникнуть, если расширение в строке формата включает вещи, которые можно интерпретировать как спецификаторы формата, как обсуждалось здесь в контексте программирования на C. Также обсуждается здесь :Правило линтинга ShellCheck SC2059 Не использовать переменные в строке формата printf .

0
01.05.2020, 03:34

Теги

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