【问题标题】:elif statements not workingelif 语句不起作用
【发布时间】:2023-03-07 07:57:02
【问题描述】:

我正在尝试使此代码正常工作。如果输入 1,它将打开 iTunes。如果输入 2,它会打开 iPhoto 等。我使用了 if/elif/else 并且我一直在一遍又一遍地检查该方法。好像写的很到位。代码如下:

#!/bin/sh

echo Please choose one.
echo 1. Open iTunes.app
echo 2. Open iPhoto.app
echo 3. Open iMovie.app
read UserChoice

cd /Users/$USER/Applications
if [ “$UserChoice”=“1” ]; then
 open iTunes.app
elif [ “$UserChoice”=“2” ]; then
 open iPhoto.app
elif [ “$UserChoice”=“3” ]; then
 open iMovie.app
else
 echo “Please choose a number.”
fi

然而,每次我运行这段代码时,它只听第一个“if”语句。因此,如果我键入 2 或 3,它只会打开 iTunes,运行第一个 if 语句。我没有正确使用 elif 还是有其他方法可以使这项工作?

【问题讨论】:

  • 这与问题无关,但您发布的代码使用了“智能引号”,shell无法识别。确保在脚本中使用纯 ASCII 引号。
  • 我不太明白你在说什么。什么是智能引号和 ASCII 引号?
  • ASCII 引号更简单——它们没有弯曲,也没有区分左右形式。请参阅this 的“背景”部分。区别很重要:echo “Please choose a number.” 打印 “Please choose a number.” 包括引号,因为 shell 将它们视为字符串的一部分,而不是字符串周围的分隔符。将此与 echo "Please choose a number."(纯 ASCII 引号)进行比较,后者打印 Please choose a number.(正确识别和删除引号)。

标签: macos shell unix scripting


【解决方案1】:

您需要在“=”周围放置空格

这样

if [ "$UserChoice" = "1" ] ; then

详情请参考this

【讨论】:

    【解决方案2】:

    改为使用比较器 ==,[“$UserChoice”=“1”] 将 1 分配给 UserChoice 并返回 true => 语句始终为 true。

    【讨论】:

    • 我查看了 Apple 文档中的 Shell 脚本。好像只用 = 而不是 ==
    • 不,问题出在空格上。 == 是一个非标准的bashism,标准的[ 命令(又名test)只支持=
    【解决方案3】:

    在打开的 XX.app 语句后放置分号。并确保您使用 == 检查(比较)而不是 =(分配)

    【讨论】:

    • 两者都没有;您正在考虑其他语言。
    猜你喜欢
    • 2022-11-03
    • 2011-10-24
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多