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
相关产品推荐
相关产品推荐

