除了语法错误@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
缩进代码。 – Cyrus
请看看:http://www.shellcheck.net/ – Cyrus