【问题标题】:Bash "for" loop, if condition count is zero?Bash“for”循环,如果条件计数为零?
【发布时间】:2011-11-21 16:15:31
【问题描述】:

我在 bash 中有一个 for 循环;

for Names in `grep "name" $people`
do
    echo "name is $name"
done

我怎样才能有一个类似的 if 语句;

for Name in `grep "name" $people`
# Make sure we found some names
if [ "count of $Name=0" ]
then
    echo "no names found"
fi

# Else, if we did grep out a list of names, print them
do
    echo "name is $Name"
done

【问题讨论】:

    标签: bash for-loop count


    【解决方案1】:

    如果for 块的返回码为0(意味着它从未进入循环并调用false),则添加compound conditional test (&&) 以打印调试文本:

    for NAME in $(grep "name" $people)
    do
        echo "Name is ${NAME}"
        false
    done && echo "no names found"
    

    如果您不喜欢它的读取方式,只需反转 for:

    ! for NAME in $(grep "name" $people)
    do
        echo "Name is ${NAME}"
        false
    done || echo "no names found"
    

    【讨论】:

    • 逻辑有点倒退。我想它可以通过某个地方的战术否定来解决。
    • 我非常喜欢这种方法,谢谢。它教会了我一种看待这个问题逻辑的新方法,但正如 Tripleee 所说,有点倒退,我希望其他人能够轻松阅读我的脚本。
    【解决方案2】:

    首先执行grep 并将其结果存储在一个变量中。然后检查是否返回了某些内容,例如,wc。如果是这样,使用 grep 的结果运行循环。

    【讨论】:

    • 这似乎是最简单、最直接的病房解决方案。谢谢:D
    • 在 bash 中,KISS 原则比任何其他语言都更有效(当然 perl 除外......)
    【解决方案3】:

    你不能在循环内这样做。在循环内将标志设置为 true,或检查参数的数量。

    set -- `grep "$name" people`
    case $# in 0) echo no names found >&2;;
      *) for Name; do # special form - loop over $*
          echo name is "$Name"
      done ;;
    esac
    

    【讨论】:

    • 我喜欢这种方法三元组,使用 case 语句留下了很好的空间来添加我可以执行的额外检查,而不仅仅是“有数据”、“没有数据”。虽然,我接受的答案是最简单直接的答案,但我想我会在另一个更复杂的脚本中尝试一下,谢谢!
    【解决方案4】:

    这可能对你有用:

    sed -n '/name/{h;s//name is &/p};${x;/./!s/^/no names found/p}' $people
    

    这假定$people 是至少一行的文件

    编辑:解释 - -n 阻止默认打印输出到标准输出。在文件$people 的每一行中搜索name,如果找到,则复制行以保留空间(HS)并将name is 添加到值和打印输出之前。在最后一行交换到 HS,如果它不包含任何内容,则打印输出 no names found

    bash 替代方案是:

    names=($(grep "name" $people))
    ((${#names[@]})) && printf "name is %s\n" "${names[@]}" || printf "no names found\n"
    

    编辑:用grep 输出填充数组names。测试数组 names 的大小,如果它不为零,则在每个值前面加上 name is 并打印输出,否则打印输出 no names found

    【讨论】:

    • 谢谢波东。我完全是 sed newb,所以我无法阅读您提供的示例并 100% 理解它。但是,读到你的 bash 替代品我印象非常深刻,太棒了!这让我对情况和 Bash 的逻辑有了新的认识,非常感谢:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2013-05-05
    • 2023-01-16
    • 2020-11-07
    • 2021-01-15
    • 2020-08-21
    • 2020-04-10
    相关资源
    最近更新 更多