开发者问题收集

撰写案例陈述

2017-08-15
9100
#!/bin/bash
until [read command -eq "end"]
do
echo What command would like to run?
read command
if [$command -eq "my-tweets"]; then
node liri.js $command
fi
if [$command -eq "do-what-it-says"];then
node liri.js $command
fi
if [$command -eq "spotify-this-song"]; then
echo What item would like to query?
read item
node liri.js $command $item
fi
if [$command -eq "movie-this"]; then
echo What item would like to query?
read item
node liri.js $command $item
fi
done

我试图创建一个 case/if 语句,在运行代码的下一部分之前检查变量的值。我想检查 $command 的值,以根据用户输入的值创建此 case/if 语句。我一直收到命令未找到错误。

3个回答

除了 @PSkocik 指出的语法错误之外,当您有多个互斥的 if 条件时,使用 if ... elif... 而不是一堆 if 单独的 if 块通常更清楚/更好:

if [ "$command" = "my-tweets" ]; then
    node liri.js "$command"

elif [ "$command" = "do-what-it-says" ];then
    node liri.js "$command"

elif [ "$command" = "spotify-this-song" ]; then
...etc

但是当您将单个字符串 ( "$command" ) 与一堆可能的字符串/模式进行比较时, case 是一种更清晰的方法:

case "$command" in
    "my-tweets")
        node liri.js "$command" ;;

    "do-what-it-says")
        node liri.js "$command" ;;

    "spotify-this-song")
...etc
esac

此外,当几种不同的情况都执行相同的代码时,您可以在单个案例中包含多个匹配项。此外,最好包含一个默认模式来处理与其他任何内容都不匹配的字符串:

case "$command" in
    "my-tweets" | "do-what-it-says")
        node liri.js "$command" ;;

    "spotify-this-song" | "movie-this")
        echo What item would like to query?
        read item
        node liri.js "$command" "$item" ;;

    *)
        echo "Unknown command: $command" ;;
esac

至于循环:通常,您要么使用类似 while read command; do 的命令(请注意,没有使用 [ ] ,因为我们使用的是 read 命令,而不是 test 又名 [ 命令);要么只使用 while true; do read ... ,然后检查结束条件并从循环内部 break 退出。在这里,最好使用后者:

while true; do
    echo "What command would like to run?"
    read command
    case "$command" in
        "my-tweets" | "do-what-it-says")
            node liri.js "$command" ;;

        "spotify-this-song" | "movie-this")
            echo What item would like to query?
            read item
            node liri.js "$command" "$item" ;;

        "end")
            break ;;

        *)
            echo "Unknown command: $command" ;;
    esac
done
Gordon Davisson
2017-08-15

括号周围需要有空格。 [ ] 不是 shell 语言功能, [ 是一个命令名称,需要一个结束的 ] 参数来使它看起来更漂亮( [read 将搜索一个字面上名为 [read 的命令(可执行文件或内置命令)。

[ ] 中的字符串比较使用 = 完成, -eq 用于整数比较。

您应该仔细阅读 dash(1) 手册页或 POSIX shell 语言规范 。它们不是那么大(Bash 更大)。您还可以在其中找到 case 语句的语法。

Petr Skocik
2017-08-15

基于参数在 Bash 中简单使用 case。

case "$1" in
    argument1)
        function1()
        ;;

    argument2)
        function2()
        ;;  
    *)
        defaultFunction()
        ;;  

esac
nagendra547
2017-08-16