好的,我遇到了这个问题。我写了一个脚本在 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
这个奇怪的词其实是由identifier
和read:<中的最后
。它仅与我上面的示例相似(而不是完全相同)的原因是您的文件名和行号将与我的小测试脚本不同。ad:
组成的
关于 bash 外壳;读取命令;在 Windows 7 上使用 Cygwin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2604293/