我的片段:
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
- 当处于指挥位置时 - 是不是echo
与exit
和 甚至具有相同意义的命令[
。它是一个保留字;
- 它由 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 扩展来了分词。