必须声明标识符

必须声明标识符

我的片段:

   filename='somefile_Connectivity_12345.CSV'
   trimfilename= echo $filename| cut -d'_' -f 2
   if '$trimfilename'='Connectivity'
   then 
   echo "loop1"
   elif '$trimfilename'='Red'
   then 
echo " loop2"
elif ' $trimfilename'='Blue'
then
echo "loop3'
end if;

我遇到一个错误,提示“必须声明标识符。如果我没有 elif 部件,它就可以正常工作。

答案1

尝试这个:

#!/bin/bash
filename='somefile_Connectivity_12345.CSV'
trimfilename=$(echo $filename| cut -d'_' -f 2)
if [ $trimfilename = "Connectivity" ]
then 
  echo "loop1"
elif [ $trimfilename = "Red" ]
then 
  echo " loop2"
elif [ $trimfilename = "Blue" ]
then
  echo "loop3"
fi

答案2

基本上,当您执行以下操作时,您会尝试将 '$trimfilename' 设置为 'Connectivity':

if '$trimfilename'='Connectivity'...

if- 当处于指挥位置时 - 是不是echoexit和 甚至具有相同意义的命令[。它是一个保留字;- 它由 shell 的解析器以与、<newline>和相同的方式处理-事实上,! dammit以相同的方式处理。=

if表示一个块的开始if,它至少由一个组成复合命令,由 1 或简单的命令。也许我能描述的最有用的方式是:

#one compound command
{ simple command; simple command; simple command; } 

if { : this compound command returns 0 ; }
then { : do this compound command ; }
else { : do this compound command ; }
fi

每个之间的大括号保留字 if, then;并且else默示if块中,并且是不必要的。但所有这些都由 shell 的解析器处理。

发生解析变量扩展/赋值,所以当你这样做时:

if var=val
then :
else :
fi

...您正在测试是否任务瓦尔变量返回 0 - 在这种情况下会返回 - 然后你从那里继续。...当你这样做...

if 'in\valid var name'=val
then :
else :
fi

...然后如果你幸运的话您将收到一条错误消息,并且您的 else 块已完成,尽管整个块的执行很可能会突然停止,因为它无法被解析

正如我所说,=赋值运算符是 shell 解析器的一个函数,这就是为什么它至少需要两次评估才能完成:

var=val; eval $var=val2

shell=在解析时(在扩展之前)记录了赋值函数,并且它无法处理对扩展的赋值 -因为这还没有发生。

您想要的是测试命令的返回值 - 显然是评估变量扩展的命令。这就是test为了...

if test "$var" = "val"
then echo yay
else echo nay
fi

或者...

if [ "$var" = "val" ]
then echo yay
else echo nay
fi

"quote"这对于经过测试的扩展很重要,因为该test命令只能处理如此多地方的如此多参数 - 并且shell 解析和 shell 扩展来了分词。

相关内容