You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

bash脚本中tr命令执行失败:[:lower:]命令未找到

解决bash脚本中[:lower:]: command not found的报错问题

这个问题的核心和你的运行环境直接相关——macOS Mojave自带的bash是3.2.57版本,而且如果你的脚本shebang写的是#!/bin/sh,实际上会让bash以POSIX兼容模式运行,禁用了一些bash专属的扩展特性,比如你用到的<<<(here-string)。

为什么控制台能运行,脚本里不行?

交互式bash(就是你直接在终端敲命令的环境)默认不会启用POSIX模式,所以here-string可以正常解析;但脚本如果用#!/bin/sh作为开头,bash会切换到POSIX兼容模式,这时候<<<不被识别,shell会错误拆分你的命令,把[:lower:]当成了一个独立的命令去执行,自然就报"command not found"了。

两种可靠的解决方案

方案1:修正脚本的shebang

把脚本第一行的shebang改成#!/bin/bash,明确指定用bash而非POSIX sh模式运行:

#!/bin/bash
# 你的其他脚本内容
PROJECTTITLE="$(tr '[:lower:]' '[:upper:]' <<< ${PROJECTNAME:0:1})${PROJECTNAME:1}"

方案2:改用POSIX兼容的管道写法(更通用)

如果想让脚本在更多shell环境下都能运行,替换here-string为echo + 管道的写法,这是POSIX标准支持的语法,不会有兼容性问题:

PROJECTTITLE="$(echo "${PROJECTNAME:0:1}" | tr '[:lower:]' '[:upper:]')${PROJECTNAME:1}"

额外提示:避免外部命令的替代方案(注意版本限制)

如果你的bash版本是4.0及以上,可以用bash内置的参数扩展直接实现首字母大写,不需要调用tr命令:

PROJECTTITLE="${PROJECTNAME^}${PROJECTNAME:1}"

不过遗憾的是,macOS自带的bash 3.2不支持这个特性,所以还是前面两种方案更适合你的环境。

内容的提问来源于stack exchange,提问作者jnaklaas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:58:42