你怎么用bash代表EOF?

use*_*264 19 bash

我正在尝试做类似的事情

read -d EOF stdin

for word in $stdin; do stuff; done
Run Code Online (Sandbox Code Playgroud)

我想用'EOF'代替文件结尾字符的实际表示.

编辑:谢谢你的答案,这确实是我想要做的.当我看到stdin=$(cat)哈哈时,我实际上有一个facepalm时刻

虽然你会怎么做匹配像Cd(或Cv Mv等)的东西,基本上只是一个字符结合Control,Alt,Shift,无论是什么在bash?

Joh*_*itb 14

真的没有文件结尾字符.按Ctrl-d或类似字符时,终端驱动程序通过返回无效值向读取应用程序发出已到达文件末尾的信号.当您到达文件末尾时,操作系统也会这样做.这是通过使用整数而不是字节来完成的(因此您的范围类似于-2 ^ 16 .. 2 ^ 16,而不是仅仅0..255)并返回超出范围的值 - 通常-1.但是没有任何角色可以代表eof,因为它的整个目的不是一个角色.如果你想从stdin读取所有内容,直到文件结束,请尝试

stdin=$(cat)
for word in $stdin; do stuff; done
Run Code Online (Sandbox Code Playgroud)

然而,这将读取变量的整个标准输入.你可以使用数组只为一行分配内存,并read在一行中读取一行代码:

while read -r -a array; do 
    for word in "${array[@]}"; do 
        stuff;
    done
done
Run Code Online (Sandbox Code Playgroud)

  • 在Unix中,EOF*是*一个字符.见http://en.wikipedia.org/wiki/End-of-transmission_character (6认同)
  • EOT/EOF是ASCII中的"控制字符".见<http://en.wikipedia.org/wiki/ASCII>.您描述的这种"终端驱动程序"行为的参考在哪里?这对我来说是新的. (4认同)
  • 你提到的EOT只是触发阅读程序EOF的一种方法.它不是"eof角色".如上所述,eof不是一个角色.你可以通过说"stty eof A"(或任何其他角色)来改变哪个角色触发EOF.然后,按下终端上的"A"将发出"EOF"信号. (3认同)
  • 我想我的批评不是你错了或混淆,只是你提到了一个不适用于shell编程的EOF定义. (2认同)

ash*_*ley 10

要查找控制字符是什么,请运行

$ cat | od -b
^D
0000000 004 012
0000002
Run Code Online (Sandbox Code Playgroud)

^V^D在发出命令后键入,然后是RET另一个^D(未加引号),结果是EOF是八进制004.

将结果与read(1)以下内容相结合:

$ read -d "$(echo -e '\004')" stdin
foo
bar quuz^Hx
^D
$ echo "$stdin"
foo
bar quux
$ for word in $stdin; do echo $word; done
foo
bar
quux
Run Code Online (Sandbox Code Playgroud)

是的,我^H在上面键入退格键,看看是否read(1)做对了.确实如此.

  • EOT是0x04.EOF什么都没有.只在终端上做^ D,你看到od显示没有字节,正好*因为*EOF不是字符而只是一个符号数字.如果它就像你说的那样,我们怎么能读到一个包含0x04的二进制文件? (4认同)
  • 我试过了,它停止读取文件.在用户级别,EOF是0x04.在程序员的层面上,它不是一个角色,而是一个价值.无论如何,你不会使用二进制文件读取.你应该用C编程. (4认同)
  • 你可以将`"$(echo -e'\ 004')"`简化为`$'\ x04'`.但请注意,你在这里所做的是_emulating_ normal` ^ -D`处理,因为`read` - 由于我不知道的原因 - 当使用`-d`选项时,_deactivate it_.因此,在正常情况下_unlike,`^ -D`实际上被发送_as字符`0x04`_到`read`,然后终止读,因为`0x04`_happens被定义为自定义分隔符_.在一天结束时,简单地使用`stdin = $(cat)`是更简单的解决方案. (2认同)

小智 7

两件事情...

EOF字符由Cd(或Cv Cd表示,如果你想输入它),但要做你正在尝试的,最好这样做:

while read line; do stuff "${line}"; done
Run Code Online (Sandbox Code Playgroud)

  • EOF不是对照-d.Control-d只是用于发出EOF信号键击的最常见设置. (4认同)