shell EOF 用户自定义的终止符

想必大家都可能见过EOF这个用法,但是不知道你是否注意过细节呢?

下面我们通过一个脚本menu来测试一下吧~

[plain]  view plain copy
  1. #!/bin/bash  
  2. printf "Do you want to see the menu?"  
  3. read answer  
  4. if [[ $answer == "yes" ]]  
  5. then  
  6.         cat << EOF  
  7.         1)Steak and eggs  
  8.         2)Fruit and Yogurt  
  9.         3)Pie and icecream  
  10.         EOF  
  11. echo "Pick one:"  
  12. read choice  
  13.         case "$choice" in  
  14.         1)printf "Cholesterol"  
  15.         ;;  
  16.         2)printf "Dieter"  
  17.         ;;  
  18.         3)printf "Sweet tooth"  
  19.         ;;  
  20.         esac  
  21.   
  22. else  
  23.         printf "Later alligator!"  
  24. fi  
测试执行:

[plain]  view plain copy
  1. [oracle@sor-sys zy]$ sh menu   
  2. Do you want to see the menu?yes  
  3. menu: line 25: syntax error: unexpected end of file  
语法错误,那么我们想想会是哪里出问题了呢,对了,就是那个EOF

分析:

1。cat命令后接<<和一个用户定义的终止符,在这里是EOF。终止符后面作为cat命令的输入,在屏幕上产生菜单选项,当达到第十行的终止符后,输入结束。

2。第十行的终止符恰好和第六行的终止符相匹配,否则menu文档将不会结束。另外,最后的终止符周围不能有任何空格。有良好习惯的程序员往往会使用

缩进来增强脚本的可读性,但这个例子中恰巧是因为对第十行的EOF使用缩进(使用Tab缩进)导致的一个语法错误。

解决方案:

1。将用于终止的EOF移到页的最左侧,确保它周围没有空格(但是这种方式看起来不美观哦~)。

2。bash/ksh/sh这3种shell允许使用另外一种方式。即在<<符号后面加一个长划线:cat <<-EOF注意:<<后面直接跟-否则如果有空格,也会报错~。这样就可以使用tab来缩进第十行中用来结束输入的终止符。

修改后的脚本如下:

[plain]  view plain copy
  1. #!/bin/bash  
  2. printf "Do you want to see the menu?"  
  3. read answer  
  4. if [[ $answer == "yes" ]]  
  5. then  
  6.         cat <<-end  
  7.         1)Steak and eggs  
  8.         2)Fruit and Yogurt  
  9.         3)Pie and icecream  
  10.         end  
  11. echo "Pick one:"  
  12. read choice  
  13.         case "$choice" in  
  14.         1)printf "Cholesterol"  
  15.         ;;  
  16.         2)printf "Dieter"  
  17.         ;;  
  18.         3)printf "Sweet tooth"  
  19.         ;;  
  20.         esac  
  21.   
  22. else  
  23.         printf "Later alligator!"  
  24. fi  

我这里将上面的EOF终止符换成了end,并且在<<之后加上了-,所以可以使用tab进行缩进了,O(∩_∩)O哈哈~

标注:

Cholesterol胆固醇
Dieter节食者
Sweet tooth(喜好)甜食
alligator短口鄂
see you later只译:待会见,短口鄂。
这只是英语里的一句告别时的玩笑话,关键在于later和alligator尾音押韵。如果有人这么对你说,就是表示友好罢了,一句俗语而已。

练习:

如果你只想输出一个菜单,但是并不具备选择的功能,请看下面的例子:

[plain]  view plain copy
  1. #!/bin/bash  
  2. usage()  
  3. {  
  4. cat <<EOF  
  5. Usage:  
  6.   
  7.           Command List  
  8.           ------- ----  
  9.     Choose Command list:  
  10. #########################################  
  11. U|u  show UID  
  12. G|g  show GID  
  13. S|s  show SHELL  
  14. Q|q  quit  
  15. others Error chioce,Please choice again!  
  16. #########################################  
  17.   
  18. EOF  
  19. }  
  20.   
  21. usage  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值