Сценарий оболочки работает с bash, но не с sh. Почему и как это исправить?

Вы делаете две ошибки.

  1. Вы передаете testArrayв функцию, затем создаете новый массив в функции, модифицируете его, но в конце концов распечатываете первый массив. Вы хотите распечатать измененные результаты, верно?

  2. Ваш скрипт не делает того, что вы ожидаете, потому что вы используете эту конструкцию:

     array[$counter]=${array[$counter]/%/$l16}
    

    Это замена шаблона общей формы ${parameter/pattern/string}. Вам не нужно ничего заменять. К этому моменту у вас уже готов суффикс, просто нужно добавить его, например:

    array[$counter]="${array[$counter]}${l16}"
    

Вы можете получить доступ к массиву arrayвне функции, так как массив не объявлен как локальный. Так что вы можете просто использовать:

echo -e "${array[0]}"

и т. д.

0
12.05.2020, 10:13
2 ответа

Арифметическое вычисление с ((... ))является расширением стандартного синтаксиса оболочки POSIX, который реализует bash. Большинство оболочек shне понимают такой синтаксис.

Вместо этого используйте арифметическую замену:sum=$(( sum + arg ))

В оболочке, которая не реализует не -стандарт ((... )), ваша команда (( sum += arg ))будет интерпретироваться как вложенная подоболочка, вызывающая команду sumс двумя аргументами +=и arg.

В macOS sum— это утилита, которая вычисляет контрольные суммы файлов (см. man sum), и файлы +=и argне могут быть найдены (, поэтому вы получаете эту конкретную ошибку ).

4
20.08.2021, 10:45

Использовать 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 я рекомендую:

-Неофициальная вики Баша

-Библия Баша

2
20.08.2021, 10:45

Теги

Похожие вопросы