*关于EOF--用户自定义的终止符*

想必大家都可能见过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
语法错误,那么我们想想会是哪里出问题了呢,对了,就是那个EOF

分析:

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 <

 
  

你可能感兴趣的:(点点滴滴,Linux,知识小结)