shell (($word =“y”)的语法错误||$word =““Y”))[已关闭]

jgovgodb  于 2023-01-31  发布在  Shell
关注(0)|答案(2)|浏览(141)

已关闭。此问题需要超过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 ")
watbbzwu

watbbzwu1#

您需要[[ ... ]],而不是((...))(用于 * 算术 * 表达式)

#!/bin/bash

read word

if [[ $word = "y" || $word = "Y" ]]
then    
    echo "YES"
elif [[ $word = "n" || $word = "N" ]]
then    
    echo "NO"
fi

您可以使用模式匹配而不是严格的相等性测试来简化此过程

if [[ $word = [Yy] ]]
then
    echo "YES"
elif [[ $word = [Nn] ]]
then
    echo "NO"
fi

或者使用标准case语句

case $word in
  [Yy]) echo "YES" ;;
  [Nn]) echo "NO" ;;
esac
up9lanfz

up9lanfz2#

您对条件使用了(非常)非标准语法。请考虑简化的:

#!/bin/bash

word=foo

if (( $word = 0 )) # || $word = "Y" ))
then
        echo "YES"
elif (( $word = 6 )) # || $word = "N" ))
then
        echo "NO"
fi

echo foo = $foo

这是一种有效的语法,因为bash会很乐意解析它,但它肯定不会执行您所期望的操作。if (( $word = 0 ))不检查$word是否等于0,而是将0赋给名为$word的变量(在本例中,它分配变量foo)并判断该值是否为非零。由于$foo现在为零,执行elif部分,并将6赋值给foo$foo(6)的新值为非零,因此回显NO
yY在此上下文中被视为0,但是||在此是布尔运算符,并且代码$word = 'y' || $word = 'Y'被解析为好像它是$word = ( 'y' || $word ) = 'Y',这错误地尝试分配非变量'y' || $word。(或者它可能正在计算'y' || $word,并试图分配变量0,这不是一个有效的名称。这感觉更像是一个哲学问题。这是一个解析错误,所以我们可能不应该尝试说它正在“尝试”做什么。)错误消息向您显示了这一点,并尽最大努力准确地指出错误所在。编写(( $word = 'y' || ( $word = 'Y') ))是有效的语法,它将0赋值给foo,但这肯定不是你想要的语义。相反,你的代码应该是:

#!/bin/bash

read word

case $word in
y|Y) echo YES;;
n|N) echo NO;;
esac

如果出于某种原因,您确实希望使用链式if/else而不是case,则需要的语法是:

#! /bin/bash

read word

if test "$word" = y || test "$word" = Y; then   
    echo "YES"
elif test "$word" = n || test "$word" = N; then 
    echo "NO"
fi

您经常会看到test被写为[并带有一个额外的尾随参数],我认为这是一种可怕的做法。
还需要注意的是,我改变了你的引用方式,通常来说,用双引号将变量插入值括起来是个好主意,但是不需要将不包含特殊字符或空格的字符串括起来。

相关问题