我刚刚开始学习shell,当我在这个简单的代码中遇到语法错误时,我感到非常困惑:
str="Hello world!"
echo $(expr length "$str")
但是这段代码实际上可以在乌班图上运行。是因为我的 bash 版本已经过时了吗?还是MacOS系统有问题?
我已经更新了我的 bash 版本,现在是 GNU bash 5.1.16,但这个问题仍然存在。我现在真的很困惑。
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,它并没有真正的区别。
如果您发现自己需要在 POSIXsh
/Bourne shell 脚本中移植字符串的长度,也许可以求助于 Awk。
len=$(printf '%sn' "$str" | awk '{ print(length($0)) }')
(如果str
包含多行,这将打印多个数字。如果您需要找到带有嵌入式换行符的字符串的总长度,更改它并不难,但我猜我们不需要去那里。