Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
Linux bourne shell脚本上未发生任何操作_Linux_Shell_Sh - Fatal编程技术网

Linux bourne shell脚本上未发生任何操作

Linux bourne shell脚本上未发生任何操作,linux,shell,sh,Linux,Shell,Sh,我把数字编码成1到100。 我执行了这个代码,但什么也没发生。。。 我想知道我的代码有什么问题 请用我不好的英语理解 你们之间不应该有空间!和/bin/sh。脚本的第一行应该是: #!/bin/sh 而不是/垃圾箱/垃圾箱 另外,请注意,如果您真的想使用Bourne shell,它实际上应该是: #!/bin/bash 编辑1:更多问题: 由于要使用bash,最好在条件语句中使用双括号,即: if [[ $j -le $i ]] 因为它们在bash中更“强大” 对于此特定表达式,还可以执行

我把数字编码成1到100。 我执行了这个代码,但什么也没发生。。。 我想知道我的代码有什么问题

请用我不好的英语理解


你们之间不应该有空间!和/bin/sh。脚本的第一行应该是:

#!/bin/sh
而不是/垃圾箱/垃圾箱

另外,请注意,如果您真的想使用Bourne shell,它实际上应该是:

#!/bin/bash
编辑1:更多问题:

由于要使用bash,最好在条件语句中使用双括号,即:

if [[ $j -le $i ]]
因为它们在bash中更“强大”

对于此特定表达式,还可以执行以下操作:

if (( j <= i ))
似乎也有算法问题,但我没有时间重新创建您的脚本,只有在我可以在我的计算机上复制粘贴时才会检查它们。你能在你的问题中粘贴你的脚本的更新版本吗?对我们来说,这比处理图像容易

编辑2:这是你的最后一篇文章:

第4行:闭合括号前缺少空格:

while [ $i -le 100 ]
现在,如果您想知道脚本正在做什么,可以添加以下命令,例如,在shebang之后:

set -x

如StephaneVeyret所示,shebang不应该有空间

脚本的目的似乎是按顺序打印数字。如果是这种情况,您可能需要看一看这样的简单代码:

#!/bin/bash
for i in {1..100}
do
    printf "$i\n"
done

您的代码存在一些技术问题,如果我理解您试图正确执行的操作,那么在设计中也会出现一些逻辑错误

我将分享一些关于我如何看待这一点的评论。首先要注意的是,您显示的代码缩进不一致,这意味着仅通过查看代码很难看到代码的逻辑结构。我将其加载到我常用的编辑器VSCode中,该编辑器具有方便的文档格式功能许多其他代码编辑器具有类似的自动格式功能,并产生以下结果:

#!/bin/sh
i=2

while [ $i -le 100]; do
        c=0
        j=1

        while [ $j -lt $i ]; do
                if [ $(($i % $j)) -eq 0 ]; then
                        c=$(($c + 1))
                fi
                j=$(($j + 1))

                if [ $c -eq 0 ]; then
                        echo i
                fi
        done

        i=$(($i + 1))
done
请注意,这与原始代码相比,如何正确地显示内部while循环中的语句嵌套。即使您没有访问高级编辑器的权限,也值得花时间来确保代码手动缩进正确。这将节省您以后理解和调试代码的大量时间

另外请注意,如果要打印i变量的值,代码末尾的echo i行应该是echo$i

当我试图运行这段代码时,它实际上会给我一个错误,告诉我第4行中缺少一个“]。正如Stéphane Veyret所指出的,100后面需要一个空格:

while [ $i -le 100 ]; do
接下来,我在代码中的不同点添加了额外的回显行,只是为了调试它。例如,我尝试的第一件事是在最后一行代码的最后一行之前添加以下行

echo "i=" $i 
当我运行代码时,我看到这个消息被打印了多次,它告诉我循环正在运行,并且我正在按照预期从2递增到100。然后,我在while循环中添加了更多的回音线,以检查其他变量的值

这些调查突出了你的逻辑中的一个问题

if [ $(($i % $j)) -eq 0 ]; then
在外while循环的每次循环开始时,变量j设置为1。任何数模1都等于零,因此当j为1时,此测试始终为真。这意味着,每次在外部循环c=$$c+1中遇到此代码时,c将始终递增。这意味着下面的测试如果[$c-等式0];那就永远不会是真的


我希望这能让您了解问题所在,以及如何进一步测试和调试代码,使其达到您的目的。

欢迎使用Stack Overflow。请尽快阅读该页面,并访问描述和的链接。此外,发布带有淫秽内容的代码似乎是一件可爱的事情。。。。直到你的潜在雇主在面试时将你的代码示例保存在他们的文件夹中。。。运用良好的判断力。为了确保并帮助您了解算法,您到底想做什么?如果我猜的话,我会说你正在尝试得到2到100之间所有数字的所有除数。是吗?@rohan:你以为会发生什么?你只有一个陈述,它将显示结果echo i。当c等于0时,这将打印字母i。但是由于循环从2运行到100,对于每个迭代,$i%$j将至少为零一次。因此c总是大于零,并且不会打印任何内容。哦,谢谢!但问题仍然存在。我必须处理/bin/sh。我更新了帖子。我很感谢你的支持。然后你应该更新你的帖子标题,因为你在谈论“bourne shell”,也就是bash。我现在很困惑。我学习Linux才几天。我研究的书是‘伯恩·谢尔/bin/shbashshell/bin/Bash’。我的作业说明说我应该写
它在伯恩壳牌公司。现在我不知道该怎么办了。实际上,/bin/sh将在您的计算机中使用默认的shell,现在大多数情况下都是bash。但是你不应该依赖它,因为你使用的是bash特有的东西,比如双括号,如果我没有弄错的话,你应该在shebang中指定/bin/bash。我只需要打印十进制数字。。。
echo "i=" $i 
if [ $(($i % $j)) -eq 0 ]; then