Плохая замена Bash при попытке заглавной буквы - PullRequest
0 голосов
/ 30 октября 2019

Я бьюсь головой об стену из-за ошибки Bad substitution в Баше. Рассмотрим следующий код:

getApiName() {
    IFS='-' # hyphen (-) is set as delimiter
        read -ra array <<< "$1" # str is read into an array as tokens separated by IFS
        for i in "${array[@]}"; do # access each element of array
            output+=${i^} #set first letter to uppercase
        done
    IFS=' '
    echo ${output}
}

Когда я делаю следующее:

getApiName "vl-date-picker"

Я получаю line 21: ${i^}: bad substitution

Я понятия не имею, что не так. Не могли бы вы, ребята, помочь мне, пожалуйста?

Заранее спасибо. Привет

1 Ответ

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

Общий ответ

Я не могу воспроизвести вашу проблему. Я вижу две возможные причины:

  • Вы используете оболочку не-bash.
    Проверьте это, добавив команду ps в скрипт и посмотритена выходе. Если в выводе нет bash, значит, вы запускаете что-то другое. Шебанг #! /bin/bash в начале вашего скрипта помогает убедиться, что bash используется, но не является гарантией. 101

  • У вас есть старая версия bash, которая не поддерживает ${i^} (например, 13-летняя версия, предварительно установленная в Mac OS X) .
    Вы можете проверить свою версию bash, используя bash --version. ${i^} была введена в bash 4.0, как можно прочитать здесь (поиск hh. There are new case-modifying word expansions) или здесь .

В любом случае, вы можете использовать другую команду, которая должна работать во всех оболочках Posix.

Если у вас версия GNU sed (проверьте с помощью sed --version), эта команда может быть

getApiName() {
    printf %s "$1" | sed -E 's/(^|-+)(.)/\U\2/g'
}

Специфичный для Nmp ответ

documentation Документация о npm-run-script состояниях

Фактическая оболочка, в которой выполняется ваш скрипт, зависит от платформы. По умолчанию в Unix-подобных системах это команда / bin / sh, в Windows - cmd.exe. Фактическая оболочка, на которую ссылается / bin / sh, также зависит от системы. Начиная с npm@5.1.0 вы можете настроить оболочку с помощью конфигурации оболочки сценария.

Поэтому, чтобы решить вашу проблему, вам просто нужно настроить npm так, чтобы вместо нее использовалось bash.

В качестве обходного пути вы также можете вызвать bash прямо в вашем скрипте. Самый простой способ сделать это - вот документ:

bash -s -- "$@" <<"EOF"
    # your original script here
EOF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...