Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix bash shell中while循环出错_Unix - Fatal编程技术网

Unix bash shell中while循环出错

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编程一无所知。您似乎有一个解析

我是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编程一无所知。

您似乎有一个解析错误。你需要一个反向报价。将行更改为:

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