Вы делаете две ошибки.
Вы передаете testArray
в функцию, затем создаете новый массив в функции, модифицируете его, но в конце концов распечатываете первый массив. Вы хотите распечатать измененные результаты, верно?
Ваш скрипт не делает того, что вы ожидаете, потому что вы используете эту конструкцию:
array[$counter]=${array[$counter]/%/$l16}
Это замена шаблона общей формы ${parameter/pattern/string}
. Вам не нужно ничего заменять. К этому моменту у вас уже готов суффикс, просто нужно добавить его, например:
array[$counter]="${array[$counter]}${l16}"
Вы можете получить доступ к массиву array
вне функции, так как массив не объявлен как локальный. Так что вы можете просто использовать:
echo -e "${array[0]}"
и т. д.
Арифметическое вычисление с ((... ))
является расширением стандартного синтаксиса оболочки POSIX, который реализует bash
. Большинство оболочек sh
не понимают такой синтаксис.
Вместо этого используйте арифметическую замену:sum=$(( sum + arg ))
В оболочке, которая не реализует не -стандарт ((... ))
, ваша команда (( sum += arg ))
будет интерпретироваться как вложенная подоболочка, вызывающая команду sum
с двумя аргументами +=
и arg
.
В macOS sum
— это утилита, которая вычисляет контрольные суммы файлов (см. man sum
), и файлы +=
и arg
не могут быть найдены (, поэтому вы получаете эту конкретную ошибку ).
Использовать shellcheck .
Пример использования вашего скрипта:
#!/bin/bash
sum=0
for arg in "$@"; do
(( sum += arg ))
done
echo $sum
результат:
$ shellcheck myscript
Line 6:
echo $sum
^-- SC2086: Double quote to prevent globbing and word splitting.
Did you mean: (apply this, apply all SC2086)
echo "$sum"
Как видите, это работает, но если вы используете sh как раньше:
#!/bin/sh
sum=0
for arg in "$@"; do
(( sum += arg ))
done
echo $sum
результат:
$ shellcheck myscript
Line 4:
(( sum += arg ))
^-- SC2039: In POSIX sh, standalone ((..)) is undefined.
Line 6:
echo $sum
^-- SC2086: Double quote to prevent globbing and word splitting.
Did you mean: (apply this, apply all SC2086)
echo "$sum"
Здесь это не работает из-за ошибки SC2039
(, которая является первой в данном примере ).
Хотя это очевидно, вы должны помнить, что sh
и bash
имеют некоторую разницу в синтаксисе. Так что это основная причина, по которой он не работает. (как подробно описал @kusalananda в своем ответе)
Вам также следует чаще использовать -x
или флаг отладки, чтобы вы могли видеть, что и в какой момент ваш скрипт дает сбой.
Для получения дополнительной информации и советов по сценариям bash и shell я рекомендую: