首页 > 解决方案 > 尝试大写第一个字母时 Bash 错误替换

问题描述

我正在Bad substitution为 Bash 中的错误撞墙。考虑以下代码:

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

我不知道出了什么问题。你们能帮帮我吗?

提前致谢。问候

标签: bash

解决方案


一般回答

我无法重现您的问题。我看到两个可能的原因:

  • 您正在使用非 bash shell。
    通过将命令添加ps到脚本并查看输出来检查这一点。如果bash输出中没有,那么您正在运行不同的东西。脚本开头的shebang #! /bin/bash有助于确保bash使用它,但不是保证。✱</p>

  • 您有一个旧版本的 bash,它不支持${i^}
    (例如 Mac OS X 上预装的 15 (!) 年旧版本)

    您可以使用 . 检查您的 bash 版本bash --version${i^}是在 bash 4.0 中引入的,可以在此处(搜索hh. There are new case-modifying word expansions)或此处阅读。

无论哪种方式,您都可以使用应该在所有 Posix shell 中工作的不同命令。

如果你有 GNU 版本的sed(检查sed --version)这个命令可能是

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

特定于 Nmp 的答案

✱国家文件npm-run-script

运行脚本的实际 shell 取决于平台。默认情况下,在类 Unix 系统上是 /bin/sh 命令,在 Windows 上是 cmd.exe。/bin/sh 所指的实际外壳也取决于系统。从 npm@5.1.0 开始,您可以使用 script-shell 配置自定义 shell。

因此,要解决您的问题,您只需配置 npm 即可bash

作为一种解决方法,您也可以bash直接在脚本中调用。最简单的方法是这里的文档:

bash -s -- "$@" <<"EOF"
    # your original script here
EOF

推荐阅读