Bash Shell; read 命令; 在 Windows 7 上使用 Cygwin

6

好的,我将为您进行翻译。需要涉及到IT技术相关内容。您想要在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:

据我理解,我遇到了一个读取问题。我正在为我的课程项目而努力工作,但我似乎无法弄清楚为什么它无法读取。我按照书上的指导进行操作,但没有成功,然后尝试了网上的一些示例,但对我也不起作用。请问是否有人知道是我的设置有问题还是我漏掉了什么,谢谢。


就此而言,您的示例在我的Cygwin和Linux环境中都可以按原样工作。请尝试这个最简单的示例,看看它是否适用于您:read NAME; echo $NAME - user229044
谢谢。问题在于编辑器上。我使用了 Windows 编辑器进行编辑和保存,而不是 vi 编辑器,所以现在已经解决了。还是谢谢你帮我测试。 - CrazyGrunt
2个回答

9

你应该在那个脚本上执行od -xcb命令。我的猜测是,它几乎肯定会有错误的行结束符。

我建议这样做的原因是因为这一行:

': not a valid identifierad: `var_name

看起来非常像这两行:

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

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

如果您在该行中的变量是var_name回车符而不是更常见的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和最后一个ad:组成的,它来自于read:。之所以与我的示例(而不是精确)相似,是因为您的文件名和行号将与我的小测试脚本不同。

4
你可以使用dos2unix来修复它。 - Dennis Williamson
或者只需使用vi,就像${DEITY:-GreatGreenArkleseizure}所期望的那样 :-) - paxdiablo
好的,我使用vi编辑器重写了它,效果非常好。终于跨过了那个令人沮丧的障碍,哈哈。非常感谢。 - CrazyGrunt

1

您可以直接使用read来提示用户,不需要使用echo

read -r -p "Enter your name and press: " var_name

好的,我尝试过了,现在我的猜测是这可能是我设置的问题。当我使用那行代码以及之前的输出时,我得到了与之前相同的错误。感谢您的快速响应。 - CrazyGrunt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接