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

问题描述 投票:0回答:1

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

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

但是这段代码实际上可以在 Ubuntu 上运行。是不是因为我的bash版本过时了?还是MacOS系统的问题?

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

bash macos shell expr
1个回答
3
投票
MacOS 上的

expr
不接受参数
length
。 手册页包含这段相当隐晦的段落:

根据 POSIX 标准,使用字符串参数

length
substr
index
match
会产生未定义的结果。在这个版本中
expr
,这些参数被视为它们各自的字符串值。

换句话说,

expr length
仅返回
length
,而
expr length "$str"
是一个语法错误,因为
expr
只接受单个参数。

这确实不是问题,因为 Bash 脚本基本上根本不需要使用

expr
。 Bash 具有内置功能,或多或少取代了所有遗留的
expr
逻辑。

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

${#str}

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

expr
是一个独立于您的 shell 的操作系统实用程序,因此您使用的 Bash 版本或实际上是否使用 shell 并没有任何区别。

如果您发现自己需要在 POSIX

sh
/ Bourne shell 脚本中可移植地获取字符串的长度,也许可以求助于 Awk。

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

(如果

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

© www.soinside.com 2019 - 2024. All rights reserved.