想必大家都可能见过EOF这个用法,但是不知道你是否注意过细节呢?
下面我们通过一个脚本menu来测试一下吧~
- #!/bin/bash
- printf "Do you want to see the menu?"
- read answer
- if [[ $answer == "yes" ]]
- then
- cat << EOF
- 1)Steak and eggs
- 2)Fruit and Yogurt
- 3)Pie and icecream
- EOF
- echo "Pick one:"
- read choice
- case "$choice" in
- 1)printf "Cholesterol"
- ;;
- 2)printf "Dieter"
- ;;
- 3)printf "Sweet tooth"
- ;;
- esac
- else
- printf "Later alligator!"
- fi
- [oracle@sor-sys zy]$ sh menu
- Do you want to see the menu?yes
- menu: line 25: syntax error: unexpected end of file
分析:
1。cat命令后接<<和一个用户定义的终止符,在这里是EOF。终止符后面作为cat命令的输入,在屏幕上产生菜单选项,当达到第十行的终止符后,输入结束。
2。第十行的终止符恰好和第六行的终止符相匹配,否则menu文档将不会结束。另外,最后的终止符周围不能有任何空格。有良好习惯的程序员往往会使用
缩进来增强脚本的可读性,但这个例子中恰巧是因为对第十行的EOF使用缩进(使用Tab缩进)导致的一个语法错误。
解决方案:
1。将用于终止的EOF移到页的最左侧,确保它周围没有空格(但是这种方式看起来不美观哦~)。
2。bash/ksh/sh这3种shell允许使用另外一种方式。即在<<符号后面加一个长划线:cat <<-EOF【注意:<<后面直接跟-否则如果有空格,也会报错~】。这样就可以使用tab来缩进第十行中用来结束输入的终止符。
修改后的脚本如下:
- #!/bin/bash
- printf "Do you want to see the menu?"
- read answer
- if [[ $answer == "yes" ]]
- then
- cat <<-end
- 1)Steak and eggs
- 2)Fruit and Yogurt
- 3)Pie and icecream
- end
- echo "Pick one:"
- read choice
- case "$choice" in
- 1)printf "Cholesterol"
- ;;
- 2)printf "Dieter"
- ;;
- 3)printf "Sweet tooth"
- ;;
- esac
- else
- printf "Later alligator!"
- fi
我这里将上面的EOF终止符换成了end,并且在<<之后加上了-,所以可以使用tab进行缩进了,O(∩_∩)O哈哈~
标注:
Cholesterol胆固醇
Dieter节食者
Sweet tooth(喜好)甜食
alligator短口鄂
see you later只译:待会见,短口鄂。
这只是英语里的一句告别时的玩笑话,关键在于later和alligator尾音押韵。如果有人这么对你说,就是表示友好罢了,一句俗语而已。
练习:
如果你只想输出一个菜单,但是并不具备选择的功能,请看下面的例子:
- #!/bin/bash
- usage()
- {
- cat <<EOF
- Usage:
- Command List
- ------- ----
- Choose Command list:
- #########################################
- U|u show UID
- G|g show GID
- S|s show SHELL
- Q|q quit
- others Error chioce,Please choice again!
- #########################################
- EOF
- }
- usage