我刚刚开始学习 shell,当我在 MacOS 上的这个简单代码中遇到语法错误时,我感到非常困惑:
str="Hello world!"
echo $(expr length "$str")
但是这段代码实际上可以在 Ubuntu 上运行。是不是因为我的bash版本过时了?还是MacOS系统的问题?
我已经更新了我的bash版本,现在是GNU bash 5.1.16,但是这个问题仍然存在。我现在真的很困惑。
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
包含多行,这将打印多个数字。如果您需要查找嵌入换行符的字符串的总长度,则更改它并不难,但我猜我们不需要去那里。 )