为什么在 bash(MacOS) 中使用 expr 时会出现语法错误?



我刚刚开始学习shell,当我在这个简单的代码中遇到语法错误时,我感到非常困惑:

str="Hello world!"
echo $(expr length "$str")

但是这段代码实际上可以在乌班图上运行。是因为我的 bash 版本已经过时了吗?还是MacOS系统有问题?

我已经更新了我的 bash 版本,现在是 GNU bash 5.1.16,但这个问题仍然存在。我现在真的很困惑。

MacOS 上的expr不接受length参数。 手册页包含这样一段相当倾斜的段落:

根据POSIX标准,使用字符串参数lengthsubstrindexmatch产生未定义的结果。在此版本中expr,这些参数被视为它们各自的字符串值。

换句话说,expr length只是返回lengthexpr length "$str"是语法错误,因为expr只接受单个参数。

这真的不是问题,因为 Bash 脚本基本上根本不需要使用expr。Bash具有内置功能,可或多或少地替换所有遗留expr逻辑。

要在 Bash 中获取字符串的长度,请尝试

${#str}

有关更多信息,可以从 Bash 中的参数扩展开始。

expr是一个独立于你的shell的操作系统实用程序,所以你使用的是哪个版本的Bash,或者实际上你是否正在使用shell,它并没有真正的区别。

如果您发现自己需要在 POSIXsh/Bourne shell 脚本中移植字符串的长度,也许可以求助于 Awk。

len=$(printf '%sn' "$str" | awk '{ print(length($0)) }')

(如果str包含多行,这将打印多个数字。如果您需要找到带有嵌入式换行符的字符串的总长度,更改它并不难,但我猜我们不需要去那里。

相关内容

  • 没有找到相关文章