- 已关闭**。此问题需要超过focused。当前不接受答案。
- 想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。
1年前关闭。
这篇文章是昨天编辑并提交审查的。
Improve this question
这是我的shell脚本,我检查输入的单词是y还是n,如果任何适当的结果匹配,那么它将打印适当的消息。
#! /bin/bash
read word
if (( $word = "y" || $word = "Y" ))
then
echo "YES"
elif (( $word = "n" || $word = "N" ))
then
echo "NO"
fi
但是当我编译这段代码时,它会成功编译,但会给我运行时错误。
Solution.sh: line 5: ((: y = y || y = Y : attempted assignment to non-variable (error token is "= Y ")
Solution.sh: line 8: ((: y = n || y = N : attempted assignment to non-variable (error token is "= N ")
2条答案
按热度按时间bis0qfac1#
您需要
[[ ... ]]
,而不是((...))
(用于 * 算术 * 表达式)您可以使用模式匹配而不是严格的相等性测试来简化此过程
或者使用标准
case
语句ih99xse12#
您对条件使用了(非常)非标准语法。请考虑简化的:
这是一种有效的语法,因为bash会很乐意解析它,但它肯定不会执行您所期望的操作。
if (( $word = 0 ))
不检查$word
是否等于0,而是将0赋给名为$word
的变量(在本例中,它赋值给变量foo
)并判断该值是否为非零值。执行elif
部分,并将6赋值给foo
。$foo
(6)的新值为非零,因此回显NO
。值
y
和Y
在此上下文中被视为0,但是||
在此是布尔运算符,并且代码$word = 'y' || $word = 'Y'
被解析为好像它是$word = ( 'y' || $word ) = 'Y'
,这错误地尝试分配非变量'y' || $word
。(或者它可能正在计算'y' || $word
,并试图分配变量0
,这不是一个有效的名称。这感觉更像是一个哲学问题。这是一个解析错误,所以我们可能不应该尝试说它正在“尝试”做什么。)错误消息向您显示了这一点,并尽最大努力准确地指出错误所在。编写(( $word = 'y' || ( $word = 'Y') ))
是有效的语法,它将0
赋值给foo
,但这肯定不是你想要的语义。相反,你的代码应该是:如果出于某种原因,您确实希望使用链式if/else而不是
case
,则需要的语法是:您经常会看到
test
被写为[
并带有一个额外的尾随参数]
,我认为这是一种可怕的做法。还需要注意的是,我改变了你的引用方式,通常来说,用双引号将变量插入值括起来是个好主意,但是不需要将不包含特殊字符或空格的字符串括起来。