Я знаю команду seq
для генерации последовательности целых чисел, по одному на строку, но я хотел бы задать два вопроса:
Можно ли записать номера последовательности в одной строке?
Можно ли создать строку из последовательности чисел, разделенных пробелом?
echo $(seq 1 10)
Ответы:
С
bash
,zsh
иksh93
вы можете использовать {start..end..step} формы расширения бандажа :источник
GNU
seq
принимает параметр separator (-s
):источник
echo $(seq 5)
работает отлично.Переносим для всех оболочек и любой системы, которая имеет seq (поскольку этот вопрос помечен)
Если начало 1:
В противном случае:
С бк:
В баш
Замечания:
Это эхо-решение работает, если значение IFS содержит символ новой строки, что он делает по умолчанию.
По умолчанию для IFS задана последовательность <пробел> <вкладка> <новая строка> . И сбрасывается при каждом чистом запуске оболочки. Но если у вас есть какие-либо опасения, что это могло измениться в каком-то крайнем угловом случае, у нас есть несколько решений.
Однако сброс значения IFS в sh может быть сложным. Читайте полную информацию здесь .
Отключить IFS.
всегда будет работать При условии, что ниже не будет кода (или дочерних сценариев), для которого требуется установить IFS, например, такого сценария
OldIFS="$IFS"
.Правильное решение.
Используя трюк для sh:
источник
IFS='<space><tab><newline>'
где те<space>
,<tab>
,<newline>
являются соответствующие буквальные символы.Использовать этот:
источник
...или...
Обе команды выше разделят целые числа пробелами.
xargs
по умолчанию имитирует/bin/echo
и поэтому каждое целое число отделяется одним пробелом. По умолчанию будет использоваться максимальная длина командной строки 128 КБ. Вы можете настроить это ...... печатает 1. I значение
-s
здесь не является произвольным - я получил его после того, как попробовал более высокое значение (которое, очевидно, работало в любом случае), но потомxargs
напечатал полезное сообщение:paste
это одна из двух (насколько мне известно) POSIX-санкционированных утилит для обработки строк произвольной длины:paste
по умолчанию используется разделитель табуляции, поэтому после каждого целого числа после второй команды будет вкладка. Вы можете...... используйте
-d
переключатель elimiter, чтобы изменить это поведение,источник
seq 10 | xargs
работает нормально, но из-за ограничений командной строкиseq 100000 | xargs
выдает 5\n
строк с разделителями (в моей системе)paste and
cut` - две санкционированные POSIX утилиты для работы со строками произвольной длины. Тем не менее,xargs | xargs
это вариант. Или иначеseq 100000|tr \\n \
$IFS
номер? И вbash
любом случае, в своем чудовищном замедлении. В своем ответе вы говоритеsh
- вам даже не нужно устанавливать$IFS
в этом контексте - он будет передан через среду, если он там установлен. И он не короче, чем тот,seq 100000|paste -s
который превосходит по производительности 5: 1. Иpaste
не приходит без каких-либо ошибок.$IFS
- я использую это все время - но я не использую это, если я не устанавливаю это, и вы не должны. Особенно вы не должны рекомендовать случайным незнакомцам, которые не знают ничего лучшего, как это следует делать. Не оставляйте это на волю случая - это компьютерная программа. Это ошибка, если она ведет себя неожиданно - зачем это разрешать?