Je connais la commande seq
pour générer une séquence d'entiers, un par ligne, mais je voudrais poser deux questions:
Est-il possible d'écrire les numéros de la séquence sur la même ligne?
Est-il possible de créer une chaîne composée de la séquence de nombres séparés par un espace blanc?
echo $(seq 1 10)
Réponses:
Avec
bash
,zsh
etksh93
, vous pouvez utiliser le formulaire d'expansion d'accolade {start..end..step} :la source
GNU
seq
prend l'-s
option separator ( ):la source
echo $(seq 5)
fonctionne bien.Portable pour tous les shells et tout système qui a seq (car cette question est balisée)
Si le début est 1:
Autrement:
Avec bc:
En bash
Remarque:
Cette solution d'écho fonctionne si la valeur de IFS contient une nouvelle ligne, ce qu'elle fait par défaut.
Par défaut, IFS est défini sur la séquence <space><tab> <newline> . Et est réinitialisé pour chaque démarrage propre du shell. Mais, si vous craignez que cela ait changé dans certains cas extrêmes, nous avons plusieurs solutions.
Cependant, la réinitialisation de la valeur de IFS sous sh peut être complexe. Lisez le détail complet ici .
Désactivez IFS.
fonctionnera toujours. À condition qu'il n'y ait pas de code ci-dessous (ou des scripts enfants) qui nécessitent un ensemble IFS, comme un script qui le fait
OldIFS="$IFS"
.Solution correcte.
Utiliser une astuce pour sh:
la source
IFS='<space><tab><newline>'
où ceux<space>
,<tab>
,<newline>
sont les caractères littéraux correspondants.Utilisez ceci:
la source
...ou...
Les deux commandes ci-dessus sépareront les entiers par des espaces.
xargs
par défaut à imiter/bin/echo
et donc chaque entier est séparé par un seul espace. Il sera par défaut à une longueur de ligne de commande maximale de 128 Ko, cependant. Vous pouvez régler cela ...... imprime 1. I la valeur pour
-s
ici n'est pas arbitraire - je l'ai obtenue après avoir essayé une valeur plus élevée (qui a apparemment fonctionné de toute façon) mais j'ai ensuitexargs
imprimé le message utile:paste
est l'un des deux utilitaires sanctionnés par POSIX (à ma connaissance) pour gérer les lignes de longueur arbitraire:paste
par défaut un délimiteur de tabulation, et donc il y aura un tabulation entre chaque entier après la deuxième commande. Vous pouvez...... utilisez l'
-d
interrupteur d'élimitation pour modifier ce comportement,la source
seq 10 | xargs
fonctionne bien, mais en raison des limites de la ligne de commande,seq 100000 | xargs
génère 5\n
lignes délimitées (sur mon système)paste and
cut` sont les deux utilitaires sanctionnés par POSIX pour travailler avec des lignes de longueur arbitraire. Cela dit,xargs | xargs
c'est une option. Ou bienseq 100000|tr \\n \
$IFS
un nombre? Et dansbash
sa lenteur de toute façon. Dans votre réponse, vous parlezsh
- vous n'avez même pas besoin de le définir$IFS
dans ce contexte - il sera transmis via l'environnement s'il y est défini. Et il n'est pas plus court que celuiseq 100000|paste -s
qui le bat en termes de performances 5: 1. Etpaste
ne vient pas avec aucun piège.$IFS
- je l'utilise tout le temps - mais je ne l'utilise que si je l'ai réglé et vous non plus. Surtout, vous ne devriez pas recommander à des étrangers aléatoires qui ne connaissent pas mieux qu'ils devraient le faire. Ne le laissez pas au hasard - c'est un programme informatique. C'est un bug s'il se comporte de manière inattendue - pourquoi permettre qu'il le soit?