bash变量中的标记数

fly*_*ire 25 bash split

我如何知道bash变量(空格分隔的标记)中的标记数量 - 或者至少,它是一个还是更多.

gun*_*uns 31

$#扩展将告诉您变量/数组中的元素数量.如果你正在使用大于2.05左右的bash版本,你可以:

VAR='some string with words'
VAR=( $VAR )
echo ${#VAR[@]}
Run Code Online (Sandbox Code Playgroud)

这有效地将字符串沿着空格(默认分隔符)拆分为数组,然后计算数组的成员.

编辑:

当然,这会将变量重新整理为数组.如果您不想这样,请使用其他变量名称或将变量重新转换回字符串:

VAR="${VAR[*]}"
Run Code Online (Sandbox Code Playgroud)

  • CAVEAT:如果`$ VAR`包含恰好是有效glob的字符串,结果将是意外的,因为会发生路径名扩展; 尝试`VAR ='*带有单词''的字符串. (6认同)

Jo *_* So 30

我无法理解为什么人们一直在使用那些过于复杂的基础知识.几乎总是一个直接的,无基础的解决方案.

howmany() { echo $#; }
myvar="I am your var"
howmany $myvar
Run Code Online (Sandbox Code Playgroud)

这使用内置于shell的tokenizer,因此没有差异.

这是一个相关的问题:

myvar='*'
echo $myvar
echo "$myvar"
set -f
echo $myvar
echo "$myvar"
Run Code Online (Sandbox Code Playgroud)

请注意,使用bash数组的@guns解决方案具有相同的问题.

以下是一个(据称)超级健壮的版本来解决问题:

howmany() ( set -f; set -- $1; echo $# )
Run Code Online (Sandbox Code Playgroud)

如果我们想避免子shell,事情开始变得丑陋

howmany() {
    case $- in *f*) set -- $1;; *) set -f; set -- $1; set +f;; esac
    echo $#
}
Run Code Online (Sandbox Code Playgroud)

这两个必须与引号一起使用,例如howmany "one two three"返回3


Myk*_*yev 10

set VAR='hello world'
echo $VAR | wc -w
Run Code Online (Sandbox Code Playgroud)

这是你如何检查.

if [ `echo $VAR | wc -w` -gt 1 ] 
then
    echo "Hello"
fi
Run Code Online (Sandbox Code Playgroud)

  • 很好,但我建议您 (a) 双引号 `$VAR`,否则该值将受到路径名扩展的影响;(b) 使用当前的 bash 功能;即: - 将计数存储在变量中(修剪空白): `count=$(( $(wc -w <<<"$VAR") ))`; - 如果计数 > 1,则执行: `if (( $(wc -w <<<"$VAR") > 1 )); 然后回显“你好”;菲` (2认同)