#!/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语句。我一直得到命令未找到错误。
答案 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