我已经获得了一个示例程序,我想知道<<ENDOFMENU
and到底起什么ENDOFMENU
作用,如果省略它并只使用 while 循环,它会不会同样起作用?
#!/bin/sh
echo "Menu test program...";
stop=0;
while test $stop -eq 0; do
cat<<ENDOFMENU
1: print the date
2,3 : print the current working directory
4: exit
ENDOFMENU
echo; echo -e "your choice?\c"
read reply
echo
case $reply in
"1")
date
;;
"2"|"3")
pwd
;;
"4")
stop=1
;;
*)
echo illegal choice
esac
done
答案1
ENDOFMENU
正如你的例子所用,就是所谓的这里的文件或者这里是文档。它允许使用多行字符串,而无需转义引号字符,例如'
和"
。
引用bash(1)
手动的:
这种类型的重定向指示 shell 从当前源读取输入,直到看到仅包含分隔符(没有尾随空格)的行。 直到该点为止读取的所有行都将用作命令的标准输入。
here-documents 的格式为:
<<[-]word here-document delimiter
不对 word 执行任何参数扩展、命令替换、算术扩展或路径名扩展。如果 word 中的任何字符被引用,则分隔符是 word 上引号删除的结果,并且不会扩展此处文档中的行。如果 word 未被引用,则此处文档的所有行都将进行参数扩展、命令替换和算术扩展。在后一种情况下,字符序列 \<newline> 将被忽略,并且必须使用 \ 来引用字符 \、$ 和 `。
您在示例中展示了以下代码:
cat<<ENDOFMENU
1: print the date
2,3 : print the current working directory
4: exit
ENDOFMENU
echo; echo -e "your choice?\c"
这使得字符串可用作流,然后使用命令将它们打印到控制台cat
。最后,它会打印另一个空行,后跟字符串your choice?
和转义序列,表示“不再产生输出”,并有效地删除后面的换行符。它可以重写为:
echo -e " 1: print the date
2,3 : print the current working directory
4: exit
your choice?\c"