首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在cygwin中编写shell脚本?(尤其是case语句/循环)

如何在cygwin中编写shell脚本?(尤其是case语句/循环)
EN

Stack Overflow用户
提问于 2020-05-10 06:28:49
回答 1查看 197关注 0票数 0

为了学习如何编写shell脚本来完成OverTheWire (Bandit)这一关,我在shellscript.sh上学习了shell脚本教程。

我花了一些时间才明白,既然我使用cygwin,我不能只写这样的东西:

代码语言:javascript
运行
复制
#!/bin/sh
MY_MESSAGE="Hello World"
echo $MY_MESSAGE

而不将其保存到var.sh等文件中

然而,我编写代码和节省cygwin的方式与我在网上看到的大多数教程的方式有很大的不同,因为似乎每个人都在使用GNU或Kali Linux。

我在cygwin上编写这段代码的方式必须是:

代码语言:javascript
运行
复制
echo '#!/bin/sh' > var.sh
echo 'MY_MESSAGE="Hello World"' > var.sh
echo 'echo $MY_MESSAGE' >> var.sh

这是非常麻烦和缓慢的(因为我只能在按回车键之前放入一行代码),而像Kali Linux,我似乎只能复制和粘贴教程中的代码。

尽管如此,我还是得到了想要的结果,但在case语句的形式上,我遇到了一块不可移动的石头。我现在尝试运行的shell脚本如下所示:

代码语言:javascript
运行
复制
#!/bin/sh
while read f
do
  case $f in
        hello)          echo English    ;;
        howdy)          echo American   ;;
        gday)           echo Australian ;;
        bonjour)        echo French     ;;
        "guten tag")    echo German     ;;
        *)              echo Unknown Language: $f         ;;
   esac
done < myfile

到目前为止,除了语法错误,我什么都没有得到。我不确定我该如何格式化它。能帮帮我吗?

编辑:

代码语言:javascript
运行
复制
stoya@Home-PC ~
$ #!/bin/sh

stoya@Home-PC ~
$ while read f
> do
>   case $f in
>         hello)          echo English    ;;
>         howdy)          echo American   ;;
>         gday)           echo Australian ;;
>         bonjour)        echo French     ;;
>         "guten tag")    echo German     ;;
>         *)              echo Unknown Language: $f         ;;
>    esac
> done < myfile

这是我将教程中的代码复制并粘贴到Notepad++,然后将代码复制并粘贴到cygwin时得到的结果。

在我按回车键后,我得到如下结果:

代码语言:javascript
运行
复制
stoya@Home-PC ~
$ #!/bin/sh

stoya@Home-PC ~
$ while read f
> do
>   case $f in
>         hello)          echo English    ;;
>         howdy)          echo American   ;;
>         gday)           echo Australian ;;
>         bonjour)        echo French     ;;
>         "guten tag")    echo German     ;;
>         *)              echo Unknown Language: $f         ;;
>    esac
> done < myfile
Unknown Language:

此外,当我直接从教程中复制和粘贴时,我得到了相同的结果。

EN

回答 1

Stack Overflow用户

发布于 2020-05-10 14:25:14

shell脚本是一个文本文件,因此您需要一个文本编辑器。Windows记事本不适合此作业,因为它无法处理带有LF (换行)行终止的文件。它使用CRLF (回车换行符)作为windows标准。

最近,我发现Notepad++是Notepad的一个很好的替代品,可以处理这两种终止。https://notepad-plus-plus.org/downloads/

当然,有大量的文本编辑器都是针对具有这种能力的程序员的。

Cygwin本身有几个可用的文本编辑器,使用最多的可能是ViM。您可以从安装程序安装它。

它非常强大,有大量的教程可以学习如何使用它。

转到您的示例,我们需要编写2个文件myscript.shmyfile

代码语言:javascript
运行
复制
$ vim myscript.sh

i键进入insert mode,按ESC键进入command mode,然后按:wq键写入文件并退出。

我们以类似的方式编写myfile

代码语言:javascript
运行
复制
$ vim myfile

然后我们将可执行标志添加到脚本

代码语言:javascript
运行
复制
$ chmod +x  myscript.sh

并运行它

代码语言:javascript
运行
复制
$ ./myscript.sh
English
American
Australian
French
German
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61704628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档