我有一些问题似乎被难住了。这似乎符合 Bash 的逻辑。
if [ "$argument" = "Y" -o "$argument" = "YES" ];
then
…
fi
有没有办法创建这个语句而不使用"$argument"
两次?我如何扩展它以添加 3 或 4 个答案,例如是的,好的
第二,
while [ "$argument" != "Y" ] || [ "$argument" != "YES" ] || [ "$argument" != "N" ] || [ "$argument" != "NO" ]; do
echo "Not a valid selection"
done
我不确定我在这里做错了什么,但无论输入的语句如何$argument
,我总是得到Not a valid selection
它不会接受 Y、YES、N 或 NO
答案1
在您的示例中,它总是说答案无效,这是因为您编写的逻辑没有有效的真实案例。不管它的价值$argument
是多少,它都会总是不等于Y
或YES
,就好像它是这些值之一一样,它不能成为另一个。
您可能想查看以下case
声明:
valid=0
while [[ valid -eq 0 ]]; do
read -p 'Really? > ' argument
case "$argument" in
Y*|y*)
valid=1
: handle 'yes' cases
;;
N*|n*)
valid=1
: handle 'no' cases
;;
*)
printf 'Invalid input "%s". Please say "yes" or "no".\n' "$argument" 1>&2
;;
esac
done
答案2
if [ "$argument" = "Y" -o "$argument" = "YES" ]; then
有没有办法在不使用“$argument”两次的情况下创建此语句?
在标准外壳中,具有case
:
case $argument in
Y|YES) echo "it's 'Y' or 'YES'";;
*) echo "it's something else";;
esac
在 Bash/Ksh/Zsh 中,使用正则表达式:
if [[ $argument =~ Y|YES ]]; then
...
在 Bash/Ksh(或带有 的 Zsh setopt kshglob
)中,使用 Ksh 风格的扩展 glob:
if [[ $argument = @(Y|YES) ]]; then
...
当然,还有各种其他选项,例如 regex ^Y(ES)?$
,或者^[yY]
匹配以y
or开头的任何内容Y
(包括yuck, no!
)。
while [ "$argument" != "Y" ] || [ "$argument" != "YES" ] ...
我不确定我在这里做错了什么
在这种情况下,手动完成逻辑会有所帮助。假设argument
是Y
,那么[ "$argument" != "Y" ]
是假的,[ "$argument" != "YES" ]
是真值,所以结果是或者是真的。对其他值重复此操作,您将看到至少其中一个比较始终为真。