已关闭。此问题需要超过focused。当前不接受答案。
**想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。
1年前关闭。
这篇文章27天前编辑并提交审查。
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条答案
按热度按时间watbbzwu1#
您需要
[[ ... ]]
,而不是((...))
(用于 * 算术 * 表达式)您可以使用模式匹配而不是严格的相等性测试来简化此过程
或者使用标准
case
语句up9lanfz2#
您对条件使用了(非常)非标准语法。请考虑简化的:
这是一种有效的语法,因为bash会很乐意解析它,但它肯定不会执行您所期望的操作。
if (( $word = 0 ))
不检查$word
是否等于0,而是将0赋给名为$word
的变量(在本例中,它分配变量foo
)并判断该值是否为非零。由于$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
被写为[
并带有一个额外的尾随参数]
,我认为这是一种可怕的做法。还需要注意的是,我改变了你的引用方式,通常来说,用双引号将变量插入值括起来是个好主意,但是不需要将不包含特殊字符或空格的字符串括起来。