Znam polecenie seq
generowania sekwencji liczb całkowitych, po jednym w wierszu, ale chciałbym zadać dwa pytania:
Czy możliwe jest zapisanie liczb sekwencji w tym samym wierszu?
Czy można utworzyć ciąg złożony z sekwencji liczb oddzielonych białą spacją?
echo $(seq 1 10)
Odpowiedzi:
Z
bash
,zsh
iksh93
, można użyć {start..end..step} formę rozwijania nawiasów :źródło
GNU
seq
przyjmuje-s
opcję separatora ( ):źródło
echo $(seq 5)
działa w porządku.Przenośny dla wszystkich powłok i każdego systemu, który ma sekwencję (ponieważ to pytanie jest oznaczone)
Jeśli start to 1:
Inaczej:
Z bc:
W bash
Uwaga:
To rozwiązanie echa działa, jeśli wartość IFS zawiera nową linię, co robi domyślnie.
Domyślnie IFS jest ustawione na sekwencję <space><tab> <newline> . I jest resetowany dla każdego czystego początku powłoki. Ale jeśli masz obawy, że mogło się to zmienić w skrajnym przypadku, mamy kilka rozwiązań.
Jednak resetowanie wartości IFS pod sh może być skomplikowane. Przeczytaj pełny szczegół tutaj .
Unset IFS.
zawsze będzie działać. Pod warunkiem, że poniżej nie będzie kodu (lub skryptów potomnych), które wymagałyby ustawienia IFS, takiego jak skrypt, który to robi
OldIFS="$IFS"
.Prawidłowe rozwiązanie
Używanie sztuczki dla sh:
źródło
IFS='<space><tab><newline>'
, gdzie ci<space>
,<tab>
,<newline>
są odpowiednie znaki dosłowne.Użyj tego:
źródło
...lub...
Oba powyższe polecenia oddzielą liczby całkowite spacjami.
xargs
domyślnie imituje,/bin/echo
więc każda liczba całkowita jest oddzielona pojedynczą spacją. Domyślnie maksymalna długość wiersza poleceń wynosi 128 KB. Możesz to dostosować ...... drukuje 1. I wartość
-s
tutaj nie jest arbitralna - otrzymałem ją po wypróbowaniu wyższej wartości (która najwyraźniej i tak działała), ale potemxargs
wydrukowałem pomocny komunikat:paste
jest jednym z dwóch (o ile mi wiadomo) sankcjonowanych przez POSIX narzędzi do obsługi linii o dowolnej długości:paste
domyślnie jest to separator tabulatorów, więc między kolejnymi liczbami po drugiej komendzie będzie tabulator. Możesz...... użyj
-d
przełącznika eliminatora, aby zmienić to zachowanie,źródło
seq 10 | xargs
działa dobrze, ale z powodu ograniczeń wiersza poleceń,seq 100000 | xargs
wypisuje 5\n
linii rozdzielanych (w moim systemie)paste and
cut` to dwa zatwierdzone narzędzia POSIX do pracy z liniami o dowolnej długości. To powiedziawszy,xargs | xargs
jest opcją. Albo inaczejseq 100000|tr \\n \
$IFS
numer? A wbash
jego godawful zwolnionym tak. W odpowiedzi, o której mówiszsh
- nie musisz nawet ustawiać$IFS
w tym kontekście - zostanie przekazany przez środowisko, jeśli jest tam ustawiony. I nie jest krótszy niż ten,seq 100000|paste -s
który bije go pod względem wydajności 5: 1. Ipaste
nie wchodzi w żadne gotchas.$IFS
- używam go cały czas - ale nie używam go chyba ja ustawić go i ani zalecana. Szczególnie nie powinieneś polecać przypadkowym nieznajomym, którzy nie wiedzą nic lepszego, powinni to zrobić. Nie pozostawiaj tego przypadkowi - to program komputerowy. To błąd, jeśli zachowuje się nieoczekiwanie - po co na to pozwolić?