撰写案例陈述
#!/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 语句。我一直收到命令未找到错误。
除了 @PSkocik 指出的语法错误之外,当您有多个互斥的
if
条件时,使用
if ... elif...
而不是一堆 if 单独的
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
括号周围需要有空格。
[
]
不是 shell 语言功能,
[
是一个命令名称,需要一个结束的
]
参数来使它看起来更漂亮(
[read
将搜索一个字面上名为
[read
的命令(可执行文件或内置命令)。
[
]
中的字符串比较使用
=
完成,
-eq
用于整数比较。
您应该仔细阅读
dash(1)
手册页或
POSIX shell 语言规范
。它们不是那么大(Bash 更大)。您还可以在其中找到
case
语句的语法。
基于参数在 Bash 中简单使用 case。
case "$1" in
argument1)
function1()
;;
argument2)
function2()
;;
*)
defaultFunction()
;;
esac