Присвойте значение al oop index (инкремент) переменной в bash - PullRequest
1 голос
/ 23 января 2020

Я только начал изучать bash, и в настоящее время что-то застрял.

В Java и других языках программирования мы можем присвоить значение переменной l oop i для другая переменная, например:

for(int i = 0; i<=5; i++){sum=i^3;}

Я пытался сделать это в bash,

for i in {1..$1}
  do
  for j in {1..$2}
   do
sum=$((i**3+j**3))

, и я также попробовал это,

sum=$(($i**3+$j**3))

но оба дали мне одну и ту же ошибку:

$ Dio.sh 2 3 1 5
Dio.sh: line 11: {1..3}**3: syntax error: operand expected (error token is "{1..3}**3")

Что мне не хватает?

Ответы [ 4 ]

1 голос
/ 23 января 2020

Вы делаете это почти так же, как в Java.

for ((i = 1; i <= $1; i++)); do
    ...
done

Расширение скобки предназначено для интерактивного использования и не расширяет параметры.

0 голосов
/ 23 января 2020

Прежде всего, код, который вы сначала представили в своем вопросе, имел следующую строку:

sum=$((i3+j3))

, которая, исходя из указанной ошибки, была опечаткой; в этом отношении ваш вопрос был отредактирован таким образом, что эта строка становится

sum=$((i**3+j**3))

, что, скорее всего, соответствует вашему сценарию.

Кроме этого, ваш вопрос был отформатирован только немного лучше, не меняя ничего значащего.

Тем не менее, сценарий все еще был неправильным по той простой причине, что он не содержит закрывающего done ни для одного из двух циклов for:

for i in {1..$1}
  do
  for j in {1..$2}
   do
sum=$((i**3+j**3))
  done # this was missing
done # this was missing

Попытка выполнить этот скрипт без в строках done должна появиться ошибка:

./yourfile.sh: line theLine: syntax error: unexpected end of file

Однако, поскольку вы показываете другую ошибку, я делаю вывод, что вы на самом деле ставите два done s в вашем скрипте, и что вы забыли их только в вопросе.

Итак, в итоге ваш код будет следующим:

for i in {1..$1}; do
  for j in {1..$2}; do
    sum=$((i**3+j**3))
  done
done

, который выдает ошибку, которой вы поделились По причине, объясненной Jetchisel в комментарии:

{1..$1} не будет работать, потому что расширение скобки происходит до расширения переменной, поэтому у вас остается буквальный $1 после l * 104 1 * готово.

Это для ответа на вопрос Чего мне не хватает? .

Способы правильного поведения объясняются в других ответах .

0 голосов
/ 23 января 2020

For-loop также можно записать так:

#!/bin/bash
sum=$(( 0 ))
for (( i=1; i<=5; i++ ))
do 
        sum=$(( $sum+i*i*i ))
        echo "Sum is: $sum"

        for (( j=1; j<=5; j++ ))
        do 
                sum=$(( $sum+j*j*j ))
                echo "Sum is: $sum"
        done

done
0 голосов
/ 23 января 2020

это один из способов сделать это

$ sum=0; for i in {1..10}; do ((sum+=i*i*i)); done; echo $sum
3025

, но, вероятно, bash не подходит для этого.

...