Что касается цикла for в KornShell

Есть ли способ реализовать следующее, используя "for" в KornShell (ksh)? Вот эквивалент C:

for(i=1;i<20;i++)
{
    printf("%d",i);
}

Мне было интересно, можно ли это реализовать, используя только «для», а не «пока»

Я пробовал следующее, вроде не работает.

for i in [1-20]
    do

    print $i
    done

Пожалуйста, дайте мне знать ваши идеи и решения.


person tomkaith13    schedule 29.03.2011    source источник
comment
выполните поиск в Интернете. ksh for выдаст ответ за доли секунды. stackoverflow.com/questions/1591109/   -  person Mat    schedule 30.03.2011
comment
конечно зависит от скорости вашего интернет-соединения   -  person Billy Moon    schedule 30.03.2011
comment
@mat: извини, друг, я продолжал искать вещи с неправильным тегом ... плохо !!   -  person tomkaith13    schedule 30.03.2011


Ответы (4)


К сожалению, похоже, что ksh не поддерживает расширение скобок на основе диапазона или не поддерживает конструкцию (( )), поэтому, чтобы сделать это компактно, вам нужно вызвать внешний двоичный файл seq следующим образом:

for i in $(seq 1 20); do
  echo $i
done
person SiegeX    schedule 29.03.2011
comment
Однако ksh в Solaris поддерживает и (()), и {1..20} ... только что протестировал их обоих ... Спасибо за альтернативный ответ - person tomkaith13; 30.03.2011
comment
Использование seq здесь выглядит немного странно. Вопрос касается реализации оболочки seq. - person Henk Langeveld; 21.06.2012
comment
'seq 1 19' становится краткой формой этого ответа ;-) - person Henk Langeveld; 21.06.2012

Не совсем ответ, но к сведению случайным пользователям ksh.

Изменить 2019-05-12 (незначительные правки ниже выделены полужирным шрифтом, остальная информация теперь зачеркнута).

Чтобы прояснить некоторые комментарии здесь, есть 2 ksh, доступные в типичных установках поставщика (не для Linux (может быть, и они тоже?)).

У Solaris и AIX есть ksh и ksh93 (вероятно, верно и для других производителей). Базовый ksh также известен как ksh88. Ksh93 описан в The New Kornshell Command and Programming Language, 1995

Системы Linux, которые имеют настоящий ksh (не pdksh), в основном используют ksh93 с именем ksh.

Наконец, чтобы еще больше запутать ситуацию, не позволяйте дате паба 1995 обмануть вас, ksh продолжается под находился в активной разработке Дэвидом Корном и Гленом Фаулером в AT&T до 2012 года? . Версии выпускались 2–3 раза в год. Некоторые версии Linux используют более новые версии.

Эти новые версии имеют очень продвинутые функции (большинство из них взято со страницы исследования AT&T UWIN. поиск по ссылке "примечания и изменения" (мертвая ссылка))

  • составные переменные, составленные как структуры c (без типов данных c, только типизированные decls) (один пользователь заявляет о структуре в памяти объемом 500 мегабайт)
  • Арифметика с плавающей запятой двойной точности с полной арифметикой C99. Числа Inf и NaN могут использоваться в арифметических выражениях.
  • Завершение TAB-TAB создает нумерованный список завершений ...
  • Поддержка обработки / обработки многобайтовых локалей (например, en_US.UTF-8, hi_IN.UTF-8, ja_JP.eucJP, zh_CN.GB18030, zh_TW.BIG5 и т. Д.) ...
  • / dev / (tcp | udp | sctp) / host / sevrice теперь обрабатывает адреса IPv6 ...
  • ... искать файл по смещению или по содержимому с новыми операторами перенаправления.
  • Новая опция --showme, которая позволяет частям скрипта вести себя так, как если бы была указана опция -x, в то время как другие части выполняются как обычно. ...
  • Добавлен оператор [[...]] = ~, который сравнивает строку с расширенным регулярным выражением ....
  • Встроенная функция printf (1) была расширена для поддержки флага = для центрирования поля ... (и других) ...
  • просмотр пути
  • «Большинство утилит были разработаны AT&T и соответствуют POSIX.2 и X / Open».

(обратите внимание, что ... s выше, как правило, указывают на то, что некоторая квалифицирующая информация удалена)

Корн и Фаулер также создали расширенную среду, UWIN (Unix для Windows) для людей, использующих такие системы, как Mingw или Cygwin, о которой следует посвятить отдельную публикацию. Обратной стороной UWIN является

  • не тот набор утилит, который вы найдете в вашем любимом Linux.
  • Другая среда компиляции файлов, которая в значительной степени должна использовать MS Visual C (говорят, что поддержка gcc через Mingw находится в процессе),
  • очень маленькое сообщество поддержки,
  • Общая общественная лицензия AT&T V 1.0 Общественная лицензия Eclipse * не является GNU.

См. главную страницу UWin (мертвая ссылка) : к сожалению, устарело, лучше копаться в dnld ссылке выше. Хм, это намного лучше FAQ Гленна Фаулера для UWin (тоже мертв, кто-нибудь из Time Machine?).

Надеюсь, это поможет!

Изменить 2019-05-12. Причина мертвых ссылок? Дэвид Корн и Глен Фаулеры уволены (в AT&T, 2012 г.?

Позже появилась информация, что они работают в Google. Я не могу это подтвердить, поэтому считайте это старым слухом.

И см. Ksh93 мертв?

Похоже, что на сайте ast git-hub все еще наблюдается некоторая активность. ast - это общий пакет, который включает ksh93. Здесь вы можете получить свежий исходный код и скомпилировать его.


Вот текст описания проекта. (В README.md содержится значительно больше информации).

КШ93

Этот репозиторий содержит набор инструментов AT&T Software Technology (AST) от AT&T Research. С ноября 2017 года фокус разработки был перенесен на команду ksh (или ksh93) и вспомогательный код, необходимый для ее создания.

Код проекта AST, отличный от ksh, больше не поддерживается активно. Если вас интересует код, отличный от ksh, см. Ниже подробную информацию о том, какие ветки содержат полную базу кода AST.

Проект поддерживает только системы, в которых компилятор и базовое оборудование совместимы с ASCII. Это включает Linux на IBM zSeries, но не z / OS. Возникшая неполная поддержка EBCDIC была удалена. См. Выпуск № 742.

* EPL заменил оригинальный CPL AT&T.

person shellter    schedule 03.04.2011

ksh93 поддерживает C-подобный (( ...;...; ...)):

for ((i=1;i<20;i+=1)); do
    printf "%d " $i
done && print

Это произведет:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

Черт возьми, даже старый синтаксис (использование '{' ... '}' вместо 'do ... done' будет работать):

for((i=1;i<20;i+=1))
{
   printf "%d " $i
} && print

В более старых оболочках вы все еще можете получить тот же эффект с

i=1 && while ((i<20)); do
    printf "%d " $i
    ((i+=1))
done && print
person Henk Langeveld    schedule 02.04.2011

ksh93 предлагает расширение braceexpansion, даже если "braceexpand" включен. Проверьте с помощью "set -o", а затем используйте фигурные скобки {}

for i in {1..20}
do
  print $i
done
person user6248488    schedule 27.04.2013