撰写案例陈述

问题描述 投票:3回答:3
#!/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语句。我一直得到命令未找到错误。

bash if-statement switch-statement case-statement
3个回答
1
投票

括号周围需要空格。 [ ]不是shell语言特性,[是一个命令名称,需要关闭]参数才能使事物看起来很漂亮([read将搜索命名为[read的命令(可执行文件或内置函数))。

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

你应该仔细阅读dash(1)联机帮助页或POSIX shell language specification。它们不是那么大(Bash更大)。你也可以在那里找到case语句的语法。


0
投票

除了@PSkocik指出的语法错误,当你有一些相互排斥的if条件时,如果单独的if ... elif...阻塞,使用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

0
投票

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

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

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

esac
© www.soinside.com 2019 - 2024. All rights reserved.