Использование 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
; если последний не работает, используйте первого).
Вы не можете непосредственно распечатать коды 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
%c
Интерпретирует связанный аргумент как символ: только первый символ данного аргумента печатается
У Вас, кажется, уже есть способ распечатать их, но вот один вариант.
for i in `seq 32 127`; do printf "\x$(printf "%x" $i) $i"; done
Вам нужно 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
Если вы, как и я, предпочитаете, чтобы строка формата 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 .
bash
иzsh
это может быть сделано без цикла и без внешней команды:printf $(printf '\%o' {32..127})
. – manatwork 04.08.2012, 15:02(char)(127)
возвратитесь или что-то как этот. Независимо от того, что это, это появляется как одно из шестнадцатеричных полей или независимо от того, что их называют. Если Вы хотите только "печатаемое" (т.е. читаемый), просто перейдите в 126. Кроме того, хорошая мысль с восьмеричным. Это умно; я думал с точки зрения шестнадцатеричного (какprintf '\x%x; {32..126}
... или 127, я предполагаю, так как все Вы сделали это, также), но это не работает. Восьмеричный спасает положение!:) Наконец, @Ifthikhan, я не уверен, что Вы имеете в виду.awk
часто команды C-стиля использования и больше нигде%c
б/У. Используя восьмеричные числа отличается, чем использование однобайтовых символов. – Dylan 20.11.2014, 16:31