选择(循环)或命令在 shell 脚本中不起作用

选择(循环)或命令在 shell 脚本中不起作用

多年来我一直在研究 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

相关内容