Вложенный в стиле C для цикла возвращает ошибку времени выполнения - PullRequest
0 голосов
/ 13 октября 2019

Я пишу простую функцию, которая печатает линии, чтобы нарисовать коробку с printf (так же, как ваше обычное рождественское назначение) в оболочке. Чтобы добиться этого, я использую два вложенных C-стиля для циклов, которые выглядят так:

# Prints $1 spaces, "$2", "$3" $4 times, "$5", and a linefeed $6 times
_titlebox_drawboxline() {
  for (( i=0; i<$6; i++ ))
  do
    printf "%*s" $1 "$2";

      for (( j=0; j<$4; j++ ))
      do
        printf "%s" "$3";
      done;

    printf "%s\n" "$5";
  done
}

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

Type a title to print: hello stackoverflow
./titlebox.sh: line 97: ((: i<: syntax error: operand expected (error token is "<")
./titlebox.sh: line 97: ((: i<: syntax error: operand expected (error token is "<")
./titlebox.sh: line 71: printf: #: invalid number
hello stackoverflow./titlebox.sh: line 73: printf: #: invalid number

./titlebox.sh: line 97: ((: i<: syntax error: operand expected (error token is "<")
./titlebox.sh: line 97: ((: i<: syntax error: operand expected (error token is "<")

Хотя строка 71 - это просто строка с надписью printf "%*s" $5 "${borders[1]}", я буду беспокоиться об этом позже, это строка 97, цикл j для которого выдает ошибку.

Я вижу, что это дает мне ошибку с i, в то время как эта строка работает только с j.

Что я делаю не так?

1 Ответ

1 голос
/ 13 октября 2019

Оператор 'for' ожидает 3 арифметических выражения. Для того, чтобы «for» было действительным, «$ 6» должно быть числовым. Вы можете добавить запасное значение (0 в примере кода ниже), чтобы сделать th

titlebox_drawboxline() {
  for (( i=0; i<${6-0}; i++ ))
  do
    printf "%*s" $1 "$2";

      for (( j=0; j<${4-0}; j++ ))
      do
        printf "%s" "$3";
      done;

    printf "%s\n" "$5";
  done
}

См .:

# Error
for ((i=0 ; i<"" ; i++ ) do pwd ; done
bash: ((: i< : syntax error: operand expected (error token is "< ")


# OK
for ((i=0 ; i<"3" ; i++ )) do  pwd ; done
/home/owner/Project/stackoverflow/58360772
/home/owner/Project/stackoverflow/58360772
/home/owner/Project/stackoverflow/58360772
```

...