【问题标题】:': not a valid identifier [duplicate]':不是有效的标识符[重复]
【发布时间】:2019-03-18 14:29:20
【问题描述】:

我已经删除了之前的两个 if 语句,并用一个 case 语句替换了它们,并试图从代码中删除所有错误。 我正在尝试运行此代码,但在 case 语句中出现错误。 "': 不是一个有效的标识符
main.sh:第 5 行:意外标记附近的语法错误 $'in\r''
'ain.sh: line 5:
case "$y" in "

    #!/bin/bash
echo "1. Julian"
echo "2. Gregorian"
read y
case "$y" in
1)echo "Enter your year (1900-2050)"
read x
if [[ $x -ge 1900 && $x -le 2050 ]]
 then
a=$((x%19)) 
b=$((x/100))
c=$((x%100))
d=$((b/4))
e=$((b%4))
g=$(((8*b+13)/25))
h=$(((19*a+b-d-g+15)%30))
m=$(((a+11*h)/319))
j=$((c/4))
k=$((c%4))
l=$(((2*e+2*j-k-h+m+32)%7))
n=$(((h-m+l+90)/25))
p=$(((h-m+l+n+19)%32)) 
o=$(date +"$x-$n-$p")

echo "Gregorian Easter is on $O."

else
 echo "Invalid Input" 
 fi
;;

2) echo "Enter your year (1900-2050)"
read x
if [[ $x -ge 1900 && $x -le 2050 ]]
 then
A=$((x%4)) 
B=$((x%7))
C=$((x%19))
D=$(((19*C+15)%30))
E=$(((2*A+4*B−D+34)%7))
M=$(((D+E+114)/31))
day=$(((D+E+115)%31))
o=$(date +"$x-$M-$day")

echo "Gregorian Easter is on $o."
else 
 echo "Invalid Input"
fi
;;
0) exit ;;
esac

【问题讨论】:

  • 您的代码错误太多,请先尝试平衡 if 语句。你不能用一个 fi 来平衡 3 ifs
  • 这是学习shell的一种方式吗?在 shell 中不是一个有用的演示。如果您正在做算术,请将这个计算密集型问题带到 awk 中。避免 shell 对算术施加的句法噪音。 (除非操作文件名)。

标签: bash shell unix


【解决方案1】:

解决标题中的问题,': not a valid identifier

read 传递一个以回车符号结尾的变量名时,就会发生这种情况。

打印该符号时,它会将光标返回到行首。

因此,read foo<CR> 尝试打印:

foo<CR>': not a valid identifier

但是,由于&lt;CR&gt; 将光标返回,它实际上打印的是:

': not a valid identifier

要解决此问题,请在您的文件上运行 dos2unix;在 vim 中运行 :set fileformat=unix,或者将其转换为具有 UNIX 换行符而不是 DOS 换行符。

【讨论】:

    【解决方案2】:

    #!/bin/sh 替换为#!/bin/bash

    elif[ 替换为elif [

    elif 行上方添加fi 行。

    elif 行下方添加then 行。

    -gt 替换为-ge

    -lt 替换为-le

    完成此操作后,您的 o 变量可能仍为空,但您可以通过添加 echo +"$x-$n-$p" 进行调试。

    【讨论】:

      【解决方案3】:

      仍然有太多错误。无论如何,我认为你想要这样的东西:

      #!/bin/bash
      echo "1. Julian"
      echo "2. Gregorian"
      read y
      case "$y" in
      1)echo "Enter your year (1900-2050)"
      read x
      if [[ $x -ge 1900 && $x -le 2050 ]]; then
      a=$((x%19)) 
      b=$((x/100))
      c=$((x%100))
      d=$((b/4))
      e=$((b%4))
      g=$(((8*b+13)/25))
      h=$(((19*a+b-d-g+15)%30))
      m=$(((a+11*h)/319))
      j=$((c/4))
      k=$((c%4))
      l=$(((2*e+2*j-k-h+m+32)%7))
      n=$(((h-m+l+90)/25))
      p=$(((h-m+l+n+19)%32)) 
      o="$date $x-$n-$p"
      
      echo "Julian Easter is on $o."
      
      else
       echo "Invalid Input" 
       fi
      ;;
      
      2) echo "Enter your year (1900-2050)"
      read x
      if [[ $x -ge 1900 && $x -le 2050 ]]; then
      A=$((x%4)) 
      B=$((x%7))
      C=$((x%19))
      D=$(((19*C+15)%30))
      E=$(((2*A+4*B-D+34)%7))
      M=$(((D+E+114)/31))
      day=$(((D+E+115)%31))
      o="$date $x-$M-$day"
      
      echo "Gregorian Easter is on $o."
      else 
       echo "Invalid Input"
      fi
      ;;
      0) exit
      ;;
      esac
      

      【讨论】:

        【解决方案4】:

        这里有一个输入- 我的一个脚本面临同样的问题。我发现我犯了一个错误。 始终确保函数名不应该有 - 而应该使用 _。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-08
          • 1970-01-01
          • 2017-08-14
          • 1970-01-01
          • 2015-01-22
          • 2020-11-06
          • 1970-01-01
          相关资源
          最近更新 更多