一个“如果”,两个“那么”:为什么不呢?

一个“如果”,两个“那么”:为什么不呢?

我想制作一个脚本,每次计数时都会添加一个空格并输出它所在的数字,直到达到 10 然后停止。我正在学习脚本,我只是制作简单的脚本来学习。这是我到目前为止所做的:

x= 1
if ["$x" < "10"] then
echo [ $x += 1 ]
echo "\n"
then
echo "done!"  
fi

答案1

一个简单的if,then子句由以下部分组成:

if followed by one or more conditions
then
   some actions
fi
some further actions

正如您所看到的,不需要添加另一个then来完成一些进一步的处理。所以你的情况应该是:

x=1
if [ $x -le 10 ]
then
   echo "$x"
   ((x++))
fi
echo 'Done!'

现在您有了一个工作if,then子句,但您还会看到唯一返回的内容1Done!

这是因为该if语句仅检查条件一次,当fi达到条件时,脚本将继续进一步处理,在本例中echo 'Done!'

为了让你的想法发挥作用,你应该使用while循环。循环while检查条件直到匹配:

x=1
while [ $x -le 10 ]
do
    echo $x
    ((x++))
done
echo 'Done!'

现在,while只要变量中的值$x小于 10,就会进入循环。当条件返回 false($x 的值小于或等于 10)时,它会跳转到语句done并继续进一步处理,在本例中这echo 'Done!'

答案2

因为计算机无法决定使用哪个分支!每个if分支都使用布尔表达式 [TRUE/FALSE] 来执行或不执行某些代码。因此,每个决策都需要执行一个操作分支。这就是为什么你只使用一个then

let 'x = 1'
if [ "$x" -lt 10 ] # if you want to write the `then` on the same line you need a ; in front of it
then
    let 'x++'
    echo "$x"
    # echo automatically creates a newline
    # the second then is useless or even wrong
    echo "done!"  
fi

help [还可以在 shell 中看到:

[: [ arg... ]
    Evaluate conditional expression.

    This is a synonym for the "test" builtin, but the last argument must
    be a literal `]', to match the opening `['.

并阅读man -s1 test, 查看有效的测试表达式。

提示

你的表达式 [ "$x += 1" ] 似乎暗示你实际上想从 1 循环到 10。由于 shell 只有有限的算术支持,你应该更好地使用seq

for x in `seq 1 9`
do echo $x
done
echo "done!"

对于很长的序列,最好不要为循环生成输入字符串for,而是一一读取值:

seq 1 1000|while read x
do echo $x
done

并检查man 1 printfand man 3 printf(通常写为 printf(1) 和 printf(3),但你告诉我们,你是初学者),添加空格

printf "%*s%s" $x "" "line"

在“line”前面添加 $x 空格。

胜利

for x in `seq 0 9`
do let 'y=2*(9-x)'
    printf "%*s%s%*s%s\n" $x "" "data" $y "" "data"
done

相关内容