for k in {0..49};
do
a=$(($((2*$k))+1));
echo $a;
done
Cześć, potrzebuję uproszczonego wyrażenia dla trzeciego wiersza, być może takiego, który nie korzysta z podstawiania poleceń.
for k in {0..49};
do
a=$(($((2*$k))+1));
echo $a;
done
Cześć, potrzebuję uproszczonego wyrażenia dla trzeciego wiersza, być może takiego, który nie korzysta z podstawiania poleceń.
bash
i nieC
, więc usuń wszystko;
- chyba że napiszesz to w osobnej linii.declare -i a; for k in {0..49}; do a=2*$k+1; echo $a; done
$(( ... ))
czy interpretacja arytmetyczna nie zastępuje poleceń.Odpowiedzi:
Korzystanie z rozszerzania arytmetycznego:
Korzystanie z przestarzałego
expr
narzędzia:Używanie
bc -l
(-l
w tym przypadku nie jest potrzebne, ponieważ nie są używane żadne funkcje matematyczne):Używając
bc -l
jako koproces (działa w tle jako rodzaj usługi obliczeniowej w tle¹):Ten ostatni wygląda (prawdopodobnie) na czystszy w
ksh93
:¹ Rozwiązało to kiedyś problem, w którym musiałem przetworzyć dużą ilość danych wejściowych w pętli. Przetwarzanie wymagało pewnych obliczeń zmiennoprzecinkowych, ale
bc
kilka razy odradzanie się w pętli okazało się wyjątkowo wolne. Tak, mogłem to rozwiązać na wiele innych sposobów, ale nudziłem się ...źródło
Możesz uprościć:
do:
źródło
Możesz użyć
let
polecenia, aby wymusić obliczenia.Zauważ, że nie potrzebujemy
$k
w tej strukturze; prostyk
wykona zadanie.źródło
a=2whateverk+1
w bieżącym katalogu znajduje się plik . Gorzej, jeśli istnieje plik o nazwiea=2+b[$(reboot)]k+1
, który wywołujereboot
polecenie. Najlepiej jest użyć((...))
tutaj (((a = 2 * k + 1))
) lub składni POSIX:a=$((2 * k + 1))
let a="2*k+1"
rozwiązać to.Rozbudowa arytmetyczna, której prawdopodobnie potrzebujesz, jest następująca:
W rzeczywistości nie musisz używać zmiennej:
Lub zmienną zliczającą można przenieść do
for ((…))
pętli:dla pętli
W takim przypadku rozszerzenie arytmetyczne można również przenieść do wewnątrz pętli for:
Lub, aby uzyskać wszystkie wartości w tablicy:
Bez formuły
Ale prawdopodobnie najkrótszym sposobem uniknięcia ekspansji arytmetycznej jest dwukrotne zwiększenie zmiennej:
Lub, jeszcze prościej, po prostu użyj seq:
źródło