bash 外壳;读取命令;在 Windows 7 上使用 Cygwin

标签 bash cygwin unix

好的,我遇到了这个问题。我写了一个脚本在 Windows 上的 cygwin 中运行。我已经尝试了一堆基本的示例脚本,以防是我的脚本问题。

所以我尝试了这个:

#!/bin/bash
echo -e "Enter your name and press [ENTER]: \c" 
read var_name
echo "Your name is: $var_name"

然后我将运行它并为 var_name 输入一个名称。

我明白了:

$ ./project1.sh
Enter your name and press [ENTER]: Jake
': not a valid identifierad: `var_name
Your name is:

据我所知,我在阅读方面遇到了问题。我正在尝试为我的类(class)做一个项目,但我似乎无法弄清楚为什么它不会阅读它。我没有成功地遵循这本书,然后求助于网络上的这些示例,这些示例似乎也不适合我。有谁知道这是我的设置还是我遗漏了什么,谢谢。

最佳答案

您应该对该脚本执行od -xcb。我的猜测是它几乎肯定会有错误的行结束字符。

我之所以这样建议是因为这条线:

': not a valid identifierad: `var_name

看起来很像这两行:

.........................ad: `var_name
': not a valid identifier

合并在一起(其中 . 字符表示已被覆盖的内容)。

如果该行中的变量是 var_ 就是这种情况namecarriage-return 而不是更正常的 var_name.

它是 Cygwin 的事实也表明了这一结论,因为当您使用 Windows 编辑器编辑脚本时,该编辑器使用 CR/LF,而 Cygwin 只需要 LF。

我怀疑您会发现在您的实际脚本上执行 od -xcb 表明您在一个或多个脚本行上有那些 Windows 行结尾。


事实上,我只是在 Ubuntu 下通过在 read 行的末尾放置一个 CTRL-M 来测试它,输出是(稍微修改以显示CTRL-M):

pax@pax-desktop:~$ od -xcb qq.sh ; ./qq.sh

0000000    2123    622f    6e69    622f    7361    0a68    6365    6f68
          #   !   /   b   i   n   /   b   a   s   h  \n   e   c   h   o
        043 041 057 142 151 156 057 142 141 163 150 012 145 143 150 157
0000020    2d20    2065    4522    746e    7265    7920    756f    2072
              -   e       "   E   n   t   e   r       y   o   u   r    
        040 055 145 040 042 105 156 164 145 162 040 171 157 165 162 040
0000040    616e    656d    6120    646e    7020    6572    7373    5b20
          n   a   m   e       a   n   d       p   r   e   s   s       [
        156 141 155 145 040 141 156 144 040 160 162 145 163 163 040 133
0000060    4e45    4554    5d52    203a    635c    2022    720a    6165
          E   N   T   E   R   ]   :       \   c   "      \n   r   e   a
        105 116 124 105 122 135 072 040 134 143 042 040 012 162 145 141
0000100    2064    6176    5f72    616e    656d    0a0d    6365    6f68
          d       v   a   r   _   n   a   m   e  \r  \n   e   c   h   o
                                                 ^^

        144 040 166 141 162 137 156 141 155 145 015 012 145 143 150 157
0000120    2220    6f59    7275    6e20    6d61    2065    7369    203a
              "   Y   o   u   r       n   a   m   e       i   s   :    
        040 042 131 157 165 162 040 156 141 155 145 040 151 163 072 040
0000140    7624    7261    6e5f    6d61    2265    0a0a
          $   v   a   r   _   n   a   m   e   "  \n  \n
        044 166 141 162 137 156 141 155 145 042 012 012
0000154

Enter your name and press [ENTER]: Pax
': not a valid identifierar_name
Your name is: 

换句话说,与您所看到的非常相似。


顺便说一句(现在我可以访问我的 Cygwin 环境),您看到的是输出:

abcdefghij.sh: line 99 read: `var_name
`: not a valid identifier

第二行覆盖第一行,给出:

`: not a valid identifierad: `var_name

也就是说,identifierad这个奇怪的词其实是由identifierread:<中的最后ad:组成的。它仅与我上面的示例相似(而不是完全相同)的原因是您的文件名和行号将与我的小测试脚本不同。

关于 bash 外壳;读取命令;在 Windows 7 上使用 Cygwin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2604293/

相关文章:

linux - 无法执行 sudo -S

linux - 如何根据部分输入来grep完整单词?

cygwin - 在 cygwin 中挂载软盘镜像

vim - Cygwin 上的 Git 错误,以前从未见过,全新安装

date - 从日志文件中获取最后 5 分钟

bash - 如何随机化列表并遍历随机化列表 (bash)

linux - 狂欢 : how to use a function (which is a string param) in an other function

node.js - Nodejs process.stdin.resume() 在 Cygwin 中不起作用

c - 如何从 parent 向 child 发送信号 SIGUSR1 和 SIGUSR2?

linux - 我如何向需要文件名的 ed 提供标准输入?