我正在尝试做类似的事情
read -d EOF stdin for word in $stdin; do stuff; done
我想用'EOF'代替文件结尾字符的实际表示.
编辑:谢谢你的答案,这确实是我想要做的.当我看到stdin=$(cat)
哈哈时,我实际上有一个facepalm时刻
虽然你会怎么做匹配像Cd(或Cv Mv等)的东西,基本上只是一个字符结合Control,Alt,Shift,无论是什么在bash?
真的没有文件结尾字符.按Ctrl-d或类似字符时,终端驱动程序通过返回无效值向读取应用程序发出已到达文件末尾的信号.当您到达文件末尾时,操作系统也会这样做.这是通过使用整数而不是字节来完成的(因此您的范围类似于-2 ^ 16 .. 2 ^ 16,而不是仅仅0..255)并返回超出范围的值 - 通常-1
.但是没有任何角色可以代表eof
,因为它的整个目的不是一个角色.如果你想从stdin读取所有内容,直到文件结束,请尝试
stdin=$(cat) for word in $stdin; do stuff; done
然而,这将读取变量的整个标准输入.你可以使用数组只为一行分配内存,并read
在一行中读取一行代码:
while read -r -a array; do for word in "${array[@]}"; do stuff; done done
要查找控制字符是什么,请运行
$ cat | od -b ^D 0000000 004 012 0000002
我^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
是的,我^H在上面键入退格键,看看是否read(1)
做对了.确实如此.
两件事情...
EOF字符由Cd(或Cv Cd表示,如果你想输入它),但要做你正在尝试的,最好这样做:
while read line; do stuff "${line}"; done