![意外的 EOF 和语法错误](https://linux22.com/image/56844/%E6%84%8F%E5%A4%96%E7%9A%84%20EOF%20%E5%92%8C%E8%AF%AD%E6%B3%95%E9%94%99%E8%AF%AF.png)
我目前正在编写第三个 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
我们不要忘记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
答案2
问题是,您的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
用于在多行上打印指令,以便它们不会换行并且更易于阅读。
答案3
让我们首先尝试单个案例。我将用来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,我就会在循环中进行迭代(这就是为什么我opt
在语句末尾将变量重置为 0 case
)。
#!/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
答案4
我个人会将“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