bash程序没有输出

时间:2016-10-31 02:20:30

标签: bash

目前正在使用bash程序根据arg line命令中的用户输入输出一串数字。

当我执行程序时,我收到错误

-c-0

在线查看让我相信错误是由不正确的语法引起的,但我似乎没有看到错误的语法是什么。删除line 3: [: missing `]' 修复了错误,但程序继续输出任何内容。

&&$var < 50

使用shellscript检查我编辑的代码:

#!/bin/bash
var=$1
if [ $var > 1&&$var < 50 ]; then
    if [ $var%2 ==  0 ]; then
    $var = $var/2
    echo $var ","
    elif [ $var%2 == 1 ]; then
    $var = 3 * $var + 1;
    echo $var ","
    fi
fi

我不再收到原始错误,但是,代码会循环一次,而不是每次都重新迭代并更新var的值。

我自己想出了最后一个问题的答案,现在代码编译并正确运行。谢谢所有帮助过的人。

3 个答案:

答案 0 :(得分:2)

比较

第3行是:

if [ $var > 1&&$var < 50 ]; then

&&操作意味着该命令被解释为具有:

if [ $var > 1

后跟&&$var < 50 ]; - 这不是test(又名[)的正确语法。当调用[时,最后一个参数必须是];这就是为什么你收到有关“遗失]”的消息。此外,此上下文中的关系运算符是I / O重定向,而不是传递给[命令的比较器。

间距在shell脚本中很重要;不要玩间距的可爱游戏,也不要冒险。

使用以下其中一项:

if [ "$var" -gt 1 ] && [ "$var" -lt 50 ]; then

或某些变体:

if [[ $var > 1 && $var < 50 ]]; then

请注意[[的Bash手册说:

  

[[一起使用时,<>运算符使用当前区域设置按字典顺序排序。

这意味着他们正在进行字符串比较,而不是数字比较。这也意味着当您输入8时,它不会通过测试(8比较大于50)。因此,即使使用-gt,您也需要使用算术比较器-lt[[

if [[ $var -gt 1 && $var -lt 50 ]]; then

算术

修好后,您有:

if [ "$var%2" ==  0 ]; then
var=$var/2
echo "$var"
elif [ "$var%2" == 1 ]; then
var=(3*$var+1);
echo "$var"
fi

除了令人震惊的(缺少)缩进之外,您可以确信无论您键入什么,"$var%2"将永远不会等于0,因为字符串末尾包含%2。与elif条件类似。您应该只使用else或包含else echo "What is $var?"子句。如果要进行算术运算,请调用算术评估:

if [ $(( $var % 2 )) ==  0 ]; then
    ((var = $var / 2))
    echo "$var"
else
    ((var = 3 * $var + 1))
    echo "$var"
fi

在Bash中有许多替代方法来编写算法。

合成

这是与Collatz Conjecture相关的代码。组装完整的脚本会给出:

#!/bin/bash

var=${1:?}
while [[ $var -gt 1 && $var -lt 50 ]]
do
    if [ $(( $var % 2 )) ==  0 ]; then
        ((var = $var / 2))
        echo "$var"
    else
        ((var = 3 * $var + 1))
        echo "$var"
    fi
done

示例输出:

$ bash xy23.sh 13
40
20
10
5
16
8
4
2
1
$

(当运行停在8时,我意识到字符串与数字比较问题正在咬我。)

答案 1 :(得分:0)

><表示“重定向标准输出”和“重定向标准输入”。使用“-gt”和“-lt”进行test / bash比较。

那里有很多关于此的指南。 Here's an example.

答案 2 :(得分:0)

comparisons语句中,您可以使用

if [[ $var -gt 1 && $var -lt 50 ]]; then

if [ $var -gt 1 ] && [ $var -lt 50 ]; then

或者

if [ $var \> 1 ] && [ $var \< 50 ]; then

或者

if [[ $(( var > 1)) && $(( var < 50 )) ]]; then

或者

if [ $(( var > 1)) ] && [ $(( var < 50 )) ]; then

或者

if [[ (( var > 1)) && (( var < 50 )) ]]; then

对于简单陈述,如果您希望使用算术运算,则必须遵循arithmetic shell expansion规则

var=$(( var/2 ))

或者

(( var = var/2 ))

代码已修复

#!/bin/bash
var=$1
if [[ $var -gt 1 && $var -lt 50 ]]; then
    if !(( var%2 )); then
        var=$(( var/2 ))
    else
        var=$(( 3 * var + 1 ))
    fi
    echo $var ","
fi