Mam następujący skrypt bash:
#!/bin/bash
upperlim=10
for i in {0..10}
do
echo $i
done
for i in {0..$upperlim}
do
echo $i
done
Pierwsza for
pętla ( bez zmiennej upperlim
w kontrolce pętli) działa dobrze, ale druga for
pętla ( ze zmienną upperlim
w kontrolce pętli) nie działa. Czy jest jakiś sposób na zmodyfikowanie drugiej for
pętli, aby działała? Dziękuję za Twój czas.
bash
shell
shell-script
for
Andrzej
źródło
źródło
for i in {0..$((upperlim))}; do echo $i; done
nie działaOdpowiedzi:
Powodem tego jest kolejność, w której rzeczy występują w bash. Rozwinięcie nawiasów następuje przed rozwinięciem zmiennych. Aby osiągnąć swój cel, musisz użyć stylu C dla pętli:
źródło
zsh
jak dobrze (ale nie zacsh
,tcsh
).Aby wykonać to w swoim stylu za pomocą wbudowanych funkcji, musisz użyć eval:
Ale z
seq
:Osobiście uważam, że użycie
seq
jest bardziej czytelne.źródło
seq
jest zewnętrznym poleceniem i nie jest dostępne wszędzie, gdzie jest bash.seq
”, uznając, że to nie jest wbudowane.read
jest na przykład wbudowany, ale nie ma żadnego powodueval
.Sposób POSIX
Jeśli zależy Ci na przenośności, skorzystaj z przykładu standardu POSIX :
Wynik:
Rzeczy, które nie są POSIX:
(( ))
bez dolara, chociaż jest to powszechne rozszerzenie, o którym wspomina sam POSIX .[[
.[
wystarczy tutaj. Zobacz także: https://stackoverflow.com/questions/13542832/bash-if-difference-between-square-brackets-and-double-square-bracketsfor ((;;))
seq
{start..end}
, i to nie może działać ze zmiennymi, jak wspomniano w podręczniku Bash .let i=i+1
: POSIX 7 2. Język poleceń powłoki nie zawiera słowalet
i nie działa wbash --posix
4.3.42dolara
i=$i+1
może być wymagane, ale nie jestem pewien. POSIX 7 2.6.4 Rozbudowa arytmetyczna mówi:ale czytanie tego dosłownie nie oznacza, że się
$((x+1))
rozwija, ponieważx+1
nie jest zmienną.źródło
Twoje podejście nie będzie działać, ponieważ w bash interpretacja nawiasów występuje przed rozszerzaniem parametrów. Musisz wcześniej rozwinąć zmienną.
Możesz obejść z eval :
Z pętlą While :
Możesz to również zrobić za pomocą polecenia seq :
Jeśli chcesz biegać
for i in {0..$upperlim}
, musisz użyć kornshell. na przykład:źródło