Lin*_*eak 10 string shell-script posix variable
我知道我可以在 Bash 中做到这一点:
wc -l <<< "${string_variable}"
Run Code Online (Sandbox Code Playgroud)
基本上,我发现的一切都涉及<<<
Bash 操作符。
但是在 POSIX shell 中,<<<
是未定义的,我几个小时都找不到替代方法。我很确定有一个简单的解决方案,但不幸的是,到目前为止我还没有找到。
Gil*_*il' 11
简单的答案是,这wc -l <<< "${string_variable}"
是 .ksh/bash/zsh 的快捷方式printf "%s\n" "${string_variable}" | wc -l
。
在方式<<<
和管道工作上实际上存在差异:<<<
创建一个临时文件作为输入传递给命令,而|
创建一个管道。在 bash 和 pdksh/mksh(但不在 ksh93 或 zsh 中)中,管道右侧的命令在子外壳中运行。但在这种特殊情况下,这些差异并不重要。
请注意,在计算行数方面,这假定变量不为空且不以换行符结尾。当变量是命令替换的结果时,不会以换行符结尾,因此在大多数情况下,您将获得正确的结果,但对于空字符串,您将获得 1。
var=$(somecommand); wc -l <<<"$var"
和之间有两个区别somecommand | wc -l
:使用命令替换和临时变量删除末尾的空行,忘记输出的最后一行是否以换行符结尾(如果命令输出有效的非空文本文件,则总是如此) ,如果输出为空则多计数一。如果您想同时保留结果和计数行,您可以通过附加一些已知文本并在最后将其剥离来实现:
output=$(somecommand; echo .)
line_count=$(($(printf "%s\n" "$output" | wc -l) - 1))
printf "The exact output is:\n%s" "${output%.}"
Run Code Online (Sandbox Code Playgroud)