Usuń średnik.
for i in `seq 2`; do echo "$i"; done > out.dat
WSKAZÓWKI
również sugerowane przez Fredrik Pihl, staraj się nie używać plików binarnych zewnętrznych, kiedy nie są potrzebne, a przynajmniej kiedy praktycznie nie:
for i in {1..2}; do echo "$i"; done > out.dat
for ((i = 1; i <= 2; ++i)); do echo "$i"; done > out.dat
for i in 1 2; do echo "$i"; done > out.dat
Należy także ostrożnie z wyjściami w words
, które mogą powodować rozszerzenie nazwy ścieżki.
for A in $(echo '*'); do echo "$A"; done
pokaże swoje pliki, a nie tylko dosłowne *
.
$()
jest również zalecana jako jaśniejsza składnia podstawień poleceń w powłokach Bash i POSIX niż w przypadku kliknięć (`
) i obsługuje zagnieżdżanie.
Do czyszczenia roztwory dobrze mierzonej na zmienne
while read VAR; do
...
done < <(do something)
I
read ... < <(do something) ## Could be done on a loop or with readarray.
for A in "${ARRAY[@]}"; do
:
done
printf może być łatwiej alternatywę w stosunku do zamierzonej funkcji:
printf '%s\n' {1..2} > out.dat
Dlaczego 'seq' zamiast' for i in {1..2}; czy ... '? –
@FredrikPihl Tak, lepiej. Lub '((i = 1; i <= 2; ++ i))' lub po prostu 'w 1 2' dla kompatybilności. Moja odpowiedź dotyczy tylko problemu z przekierowaniem, chociaż próbowałem go naprawić: '" $ i "'. – konsolebox
Po prostu pomyślałem, że możesz zaktualizować swoją odpowiedź alternatywnym * lepszym * sposobem rozwiązania problemu bez uciekania się do używania zewnętrznych plików binarnych :-) –