意外的EOF和语法错误


9

我目前正在编写我的第三个Shell脚本,但遇到了问题。到目前为止,这是我的脚本:

#!/bin/bash
echo "choose one of the following options : \
  1) display all current users \
  2) list all files \
  3) show calendar \
  4) exit script"

while read  
do  
 case in  
        1) who;;  
        2) ls -a;;  
        3) cal;;  
        4) exit;;  
 esac    
done

当我尝试运行脚本时,它说:

line2 : unexpected EOF while looking for matching '"'  
line14 : syntax error: unexpected end of file.    

我究竟做错了什么?


1
您确定是“ EOF”而不是“ ECF”吗?
l0b0

Answers:


5

问题是,您的case陈述缺少主题-应该评估的变量。因此,您可能想要这样的东西:

#!/bin/bash
cat <<EOD
choose one of the following options:
1) display all current users
2) list all files
3) show calendar
4) exit script
EOD

while true; do
    printf "your choice: "
    read
    case $REPLY in
        1) who;;
        2) ls -a;;
        3) cal;;
        4) exit;;
    esac    
done

这里case使用默认变量$REPLY,该默认变量read在没有任何变量名的情况下填充(help read有关详细信息,请参见)。

还要注意以下更改:printf用于在每一轮中显示提示(并且不添加换行符),cat用于在多行上打印指令,以使它们不换行并且更易于阅读。


6

我们不要忘记select

choices=( 
    "display all current users" 
    "list all files" 
    "show calendar" 
    "exit script"
)
PS3="your choice: "
select choice in "${choices[@]}"; do
    case $choice in
        "${choices[0]}") who;;
        "${choices[1]}") ls -a;;
        "${choices[2]}") cal;;
        "${choices[3]}") break;;
    esac
done

1
这看起来是迄今为止最干净的答案。它使用select来完全按照OP的要求进行设计。它将选择放置在数组中,这是处理此类数据的好方法,并且可以在脚本的其他地方使用。它使用break而不是exit,因此脚本在完成此部分后可以执行其他操作。
2014年

2

首先让我们尝试一个案例。我将使用以下read -p命令将用户输入读入变量,opt后跟case语句。

#!/bin/bash
read -p "choose one of the following options : \
  1) display all current users \
  2) list all files \
  3) show calendar \
  4) exit script" opt
case $opt in
1) who;;
2) ls -a;;
3) cal;;
4) exit;;
esac

上面的脚本可以正常工作,现在,我相信您需要将其循环,以便您可以读取用户输入,直到用户按下选项4。

因此,我们可以使用以下while循环来实现。我将变量opt的初始值设置为0。现在,我在循环中进行迭代,while只要opt变量的值为0(这就是为什么optcase语句末尾将变量重置为0的原因)。

#!/bin/bash
opt=0;
while [ "$opt" == 0 ]
do
read -p "choose one of the following options : \
  1) display all current users \
  2) list all files \
  3) show calendar \
  4) exit script" opt

case $opt in
1) who;;
2) ls -a;;
3) cal;;
4) exit;;
esac
opt=0
done

0

我个人将“ while”放在代码的开头。如果再用跟随它:,它将允许它循环任意多次。我就是这样写的。

while :
do
    echo "choose one of the following options : \
      1) display all current users \
      2) list all files \
      3) show calendar \
      4) exit script"
    read string
    case $string in
        1)
            who
            ;;

然后继续提问,最后以

esac
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.