【问题标题】:Write a Shell script to check if a C program print Hello World编写一个 Shell 脚本来检查一个 C 程序是否打印 Hello World
【发布时间】:2020-05-19 19:31:55
【问题描述】:

我正在尝试编写一个 Shell 脚本来编译一个 c 程序并检查它是否打印“Hello World!”到标准输出。 这就是我现在所拥有的。 diff 中的第二个参数检查是一个只有“Hello World!”的文件。在里面。

#!/bin/sh
gcc -Wall hello.c -o hello
./hello > outfile
if diff outfile check >/dev/null ; then 
  echo Same
else
  echo Different
fi

在我尝试运行脚本后,我的 Ubuntu 一直显示此错误。

"./build.sh: 8: ./build.sh: Syntax error: "fi" unexpected (expecting "then")"

请让我知道我的代码有什么问题。

【问题讨论】:

  • 您的脚本运行良好——您是如何运行它的?以"sh -x build.sh" 运行并发布输出。还要在check 上发布一个十六进制转储(例如hexdump -Cv check 的输出)
  • 我怀疑你的脚本文件有 DOS/Windows 行尾;见this question。
  • 次要问题:您在这里讨论的是 POSIX shell 脚本,但您的问题使用 bash 标签。请删除它,因为这里没有与 bash 相关的内容。

标签: c bash shell ubuntu


【解决方案1】:

正如我在评论中所说,我怀疑您的脚本文件有 DOS/Windows 行尾;见this question。

此外,由于您进行的比较只是一行,因此可以很容易地进行字符串比较(而不是将字符串保存到文件中,并使用像 diff 或 cmp 这样的文件比较器):

#!/bin/sh
gcc -Wall hello.c -o hello
if [ "$(./hello)" = 'Hello World!' ]; then 
  echo Same
else
  echo Different
fi

注意:$( ) 是“命令替换”;它将内容作为命令运行,捕获其输出,然后将其替换到命令行中。周围的双引号防止它被分成“单词”(即“Hello”和“World!”被视为单独的单词)和看起来像文件名通配符的东西被扩展成匹配文件的列表。 (您几乎应该总是在命令和变量替换周围加上双引号,因为这些效果往往会导致奇怪的问题。)

【讨论】:

    【解决方案2】:

    您可以使用 cmp 程序检查输出文件是否符合您的预期。这是我的测试脚本中的一个示例:

    cmp "file.output" "file_cmp.output"
    
    if [[ $? -eq 0 ]] ; then # this line checks if cmp exit value is 0 (everything is fine)
       echo "OK!"
    else
       echo "ERROR!"
    fi
    

    【讨论】:

    • [[ ]] 条件语法并非在所有 shell 中都可用(特别是在破折号中,它看起来像是询问者正在使用的)。我建议将要测试的命令直接放在if 条件中(即if cmp ...; then)而不是查看$?。
    • 谢谢,我不知道这种语法是如此罕见;)
    • @jul3x :一般来说,您不会期望编程语言 X 中的语句在编程语言 Y 中也同样有效,对吗?这与稀有性无关,而是您使用的语言结构并不丰富。
    【解决方案3】:

    在脚本中使用cmp 而不是diff。

    最简单的,使用<(...) bash 扩展:

    if cmp -s <(./hello) <(echo "Hello world!"); then 
       echo Same
    else
      echo Different
    fi
    

    【讨论】:

    • @KamilCuk : OP 使用的是 /bin/sh,而不是 bash,所以这没有用。
    • @user1934428 这个问题是用 bash 标记的,所以我假设它对 OP 可用。
    • 我知道,这就是我告诉 OP 修复标签的原因,因为它的编写方式令人困惑。但在问题本身中,我们可以看到他专门使用sh。可能,OP只是不知道如何正确使用标签....
    猜你喜欢
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多