Unix bash shell中while循环出错
我是UNIX的初学者。我在编写Unix bash shell中while循环出错,unix,Unix,我是UNIX的初学者。我在编写while循环时遇到了一个愚蠢的错误 代码:- $ x=0 $ while [ $x -lt 10 ] > do > echo $x > x=´echo "$x + 1" | bc´ > done; 我得到的错误是:- 0 bc´: command not found 0 bc´: command not found 0 bc´: command not found ... 有人能帮我吗?我对shell编程一无所知。您似乎有一个解析
while
循环时遇到了一个愚蠢的错误
代码:-
$ x=0
$ while [ $x -lt 10 ]
> do
> echo $x
> x=´echo "$x + 1" | bc´
> done;
我得到的错误是:-
0
bc´: command not found
0
bc´: command not found
0
bc´: command not found
...
有人能帮我吗?我对shell编程一无所知。您似乎有一个解析错误。你需要一个反向报价。将行更改为:
x=`echo "$x + 1" | bc`
如果您正在执行
x=''echo“$x+1”| bc´
以增加x
(这是danf指出的错误),请使用以下命令
x=`expr $x + 1`
还要注意空格…bash
非常挑剔
这是输出--
您可以使用bc
来实现此功能,但最好使用expr
xxxx@cse:~> x=5
xxxx@cse:~> while [ $x -lt 10 ]; do echo $x; x=`echo "$x + 1"|bc`; done;
5
6
7
8
9
不要使用反勾号执行子命令,请使用
$(cmd)
,此构造可以嵌套。为了便于学习,您可能需要使用到bc的管道来执行算术,否则,shell可以通过多种方式来执行此操作
$((x+=1))
x=$((x+1))
$((++x))
$((x++))
HTH和善良的问候您没有使用反勾号。使用`(又名严肃口音,又名U+0060)(位于美国键盘左上角)代替´(又名尖锐口音,又名U+00B4) 例如,以下方法可以很好地工作:
x=0
while [ $x -lt 10 ]; do
echo $x
x=`echo "$x + 1" | bc`
done
你的和我的唯一区别是用来引用echo“$x+1”| bc
的记号
也就是说,如果您碰巧使用bash(或类似bash的shell),那么有更好的方法来实现相同的循环。例如:
x=0
while (( x++ < 10 )); do
echo $x
done
x=0
而((x++<10));做
echo$x
完成
这样做的优点是速度更快(因为它不调用外部程序),而且更易于阅读(因为它使用了更传统的编码语法)。或
x=$($x+1))
…或该主题的变体,包括:$($x++)
…我同意:内置算法会更好,但是bc
代码也可以使用。谢谢回复。但不起作用。而[$x-lt 10];做echo$x;x=`expr$x+1´;完成;猛击:[:太多了arguments@JonathanLeffler这也会起作用,但我个人喜欢expr
@Bit\u hunter如果你的记号有误,,,,,这是ESC
键下面的键,而不是“@Bit\u hunter”,我猜你是在提示符下运行的,所以你的x
没有得到初始化…在while
之前,添加x=0
>或任何你想要的初始化。请看我的答案,我给你添加了一些例子。也请注意,<代码> Exp$x+ 1 是错误的,它必须是代码> ExPR $X+ 1 < /Cl> >(请注意在1之前的空间)。请共享完整的程序。考虑使用算术运算,即<代码>,[$X-LT 10 ]。;do echo$x;让x=x+1;done@other.anon.coward只要使用bash,就可以使用(())
而不是let。我只想指出OP没有提到任何关于bash的内容,您的答案完全由bash特定的解决方案组成。虽然这可能会起作用,但也不能保证。我现在无法检查,但我确信zsh也能做到。当然,您是对的,OP是我们的可能性ing bash很高:-)我相信zsh也能做到,因为它基本上是bash的一个扩展。我的意思是,这不符合POSIX。所以这在sh或dash中不起作用。
x=0
while (( x++ < 10 )); do
echo $x
done