用bash脚本编写案例陈述

时间:2017-08-15 17:21:14

标签: bash if-statement switch-statement case-statement

#!/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 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

除了@PSkocik指出的语法错误之外,当你有许多相互排斥的if条件时,使用if ... elif...通常更清楚/更好,而不是一堆{{1}块:

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 {1}}又名test命令);或者只使用[然后检查结束条件并从循环内部检出while true; do read ...。在这里,最好是做后者:

break

答案 2 :(得分:0)

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

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

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

esac