如何在bash中大写首字母?

时间:2020-06-03 10:18:39

标签: bash

editAppsDotPy() {
    echo 'from django.apps import AppConfig' >> apps.py
    echo >> apps.py
    echo >> apps.py
    echo "class ${APP_NAME}Config(AppConfig):" >> apps.py
    echo "    name = '${APP_NAME}'" >> apps.py
}

您如何在第5行中将变量大写? 我试图用${APP_NAME^}来做到这一点,但是它返回了一个错误。

3 个答案:

答案 0 :(得分:3)

您的函数经过重写,可以使用更多的shell:

script.sh

#!/usr/bin/env sh

capitalize()
{
  printf '%s' "$1" | head -c 1 | tr [:lower:] [:upper:]
  printf '%s' "$1" | tail -c '+2'
}

editAppsDotPy()
{
  cat >> 'app.py' <<EOF
from django.apps import AppConfig

class $(capitalize "$APP_NAME")Config(AppConfig):
    name = '$APP_NAME'
EOF
}

APP_NAME='foo'

editAppsDotPy

删除:

sh script.sh
cat app.py

输出:

from django.apps import AppConfig

class FooConfig(AppConfig):
    name = 'foo'

答案 1 :(得分:3)

假设 tr 在您的路径中,更常见的参数替换也可以为您提供帮助。 您的第五行可能如下所示:

echo "class `tr [:lower:] [:upper:] <<<${APP_NAME:0:1}`${APP_NAME:1}Config(AppConfig):" >> apps.py

我也在zsh 5.8中对此进行了测试。

答案 2 :(得分:1)

如果您的bash版本太旧而无法支持该扩展名(例如OS X版本),或者您使用的zsh之类的外壳根本不支持该扩展,必须转向别的东西。就个人而言,我喜欢perl(我认为 OS X附带的内容):

$ perl -ne 'print ucfirst' <<<"foobar"
Foobar

或较长字符串中间的内容:

$ foo=bar
$ echo "foo='$(perl -ne 'print ucfirst' <<<"$foo")'"
foo='Bar'

可在bashzsh中使用。