#!/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语句。我一直得到命令未找到错误。
括号周围需要空格。 [
]
不是shell语言特性,[
是一个命令名称,需要关闭]
参数才能使事物看起来很漂亮([read
将搜索命名为[read
的命令(可执行文件或内置函数))。
[
]
中的字符串比较是用=
完成的,-eq
用于整数比较。
你应该仔细阅读dash(1)联机帮助页或POSIX shell language specification。它们不是那么大(Bash更大)。你也可以在那里找到case
语句的语法。
除了@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
基于参数在bash中简单使用case。
case "$1" in
argument1)
function1()
;;
argument2)
function2()
;;
*)
defaultFunction()
;;
esac