多年来我一直在研究 Linux 和 Unix,但在我看来,我仍然是个新手。最近,由于从事 IT 工作,我发现自己正在努力变得更加专业。因此,出于这种想法,我正在学习 Shell 脚本。
我在使用最新版本 13.10 Saucy 的 ubuntu 中遇到了问题。当我在 sh 脚本中使用 select 命令时,它不起作用,根据我格式化命令的方式,它会返回意外的“do”或意外的“done”。请参阅以下两个示例:
这段代码产生了一个意外的“do”错误:
#/bin/bash
PS3='Please enter your choice'
select opt in option1 option2 option3 quit
do
case $opt in
"option1")
echo "you chose choice 1" ;;
"option2")
echo "you chose choice 2" ;;
"option3")
echo "you chose choice 3" ;;
"quit")
break ;;
*) echo invalid option ;;
esac
done
这段代码产生了意外的“完成”错误。
#/bin/bash
PS3='Please enter your choice'
select opt in option1 option2 option3 quit ; do
case $opt in
"Option1")
echo "you chose choice 1" ;;
"Option2")
echo "you chose choice 2" ;;
"Option3")
echo "you chose choice 3" ;;
"quit")
break ;;
*) echo invalid option ;;
esac
done
当我以交互方式或手动方式将这些参数输入命令行时,我得到了所需的结果,即可供选择的选项列表。但是,当从脚本执行时,我得到了前面提到的错误。另外,我曾在 Fedora 中尝试过这个脚本,它运行得很好!我需要做些不同的事情吗?或者我需要检查配置文件中的设置吗?只有我一个人有这个问题吗?
答案1
Syntax error: "do" unexpected
或错误Syntax error: "done" unexpected
几乎肯定是因为您尝试通过键入以下内容来运行脚本
sh yourscript
它将覆盖#!/bin/bash
指令并强制脚本在 /bin/sh 解释器中运行 - 默认情况下,它是指向 /bin/dash 的符号链接,不支持语法select
。您应该使脚本可执行
chmod +x yourscript
然后调用它
./yourscript
另一个明显的问题是你的选项列表使用小写,option1 option2 option3
但你的case语句测试Option1
Option2
Option3
-它应该是
#/bin/bash
PS3='Please enter your choice '
select opt in option1 option2 option3 quit; do
case "$opt" in
"option1")
echo "you chose choice 1" ;;
"option2")
echo "you chose choice 2" ;;
"option3")
echo "you chose choice 3" ;;
"quit")
break ;;
*) echo invalid option ;;
esac
done