【问题标题】:Bash Loop print and reduce number for counterBash Loop 打印并减少计数器的数量
【发布时间】:2016-12-16 09:43:11
【问题描述】:

我正在尝试在 Bash 中创建一小段代码,其中读取、打印一个整数,然后减去 1 并在整数达到 0 时重复。

问题是我无法在每次循环后重新分配整数 $Number。有人可以告诉我我做错了什么吗?

if [ $Number -ne 0 -o $Number -eq 0 2>/dev/null ]
then
    while [ $Number -gt 1]
    do
    printf "$Number\n"
    $Number=$Number-1
done
echo "$Number"
fi

【问题讨论】:

    标签: bash loops scripting


    【解决方案1】:

    在 bash 中,arithmetic expansions 可以使用双括号或exprlet 来完成。

    示例

    while [[ $Number -gt 1 ]]
    do
        printf "$Number\n"
        ((Number -= 1 ))
    done
    

    测试

    $ cat prog.sh
    Number=5
    while [[ $Number -gt 1 ]]
    do
        printf "$Number\n"
        ((Number -= 1 ))
    done
    
    $ bash prog.sh
    5
    4
    3
    2
    

    【讨论】:

    • 我同意 ((...))let 可用于算术评估,但我怀疑反引号与它有什么关系。据我所知,反引号是$(...) 的旧形式,它是命令扩展。您能否举一个反引号表达式的示例,该表达式在不执行命令的情况下进行算术评估(如exprlet,...)?
    • @oliv 反引号以及expr。来自 TLDP 文档,带有反引号的算术扩展(通常与 expr 结合使用)。例如,请参阅内衬文档
    • 我尝试执行此代码 sh ./test 3,但该命令无法正常工作。输出会进入一个无限循环并且会说没有找到。
    • @nu11p01n73R 我看到了 TLDP 页面,反引号用于执行 expr 命令。我的意思是,如果您说:在 bash 中,可以使用双括号或 expr 或 let 来完成算术扩展。
    • @oliv 好点。我已经更正了我的答案。感谢您指出。
    猜你喜欢
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    相关资源
    最近更新 更多