Linux Shell编程变量不会进入if或case语句

Linux Shell编程变量不会进入if或case语句,linux,shell,unix,awk,case,Linux,Shell,Unix,Awk,Case,我试过用if elif和case easc。我不知道为什么它不接受应该是真的条件 cat temp | (while read line do heading=${line%% *} echo "'$heading'" case $heading in 'Cell') echo 'hit cell' echo $line | awk "{printf '%-20s %15s', $5, `./get.sh $5`}";; 'Frequency') echo 'hit frequency' ec

我试过用if elif和case easc。我不知道为什么它不接受应该是真的条件

cat temp | (while read line
do
heading=${line%% *}
echo "'$heading'"

case $heading in
'Cell')
echo 'hit cell'
echo $line | awk "{printf '%-20s %15s', $5, `./get.sh $5`}";;
'Frequency')
echo 'hit frequency'
echo $line | awk "{gsub('\)', '', $5);printf '%6s', $5 }";;
'blah')
echo 'hit blah'
echo $line | awk "{gsub('\"', '', $0);printf '%40s', $1 }";;
*) echo 'fail';;
esac

done)
我不明白为什么它没有通过案例测试(或者如果是elif版本的话)。从回音标题行中,我得到了我所期望的: “细胞” “频率” “废话”

这些在一个循环中发生,没有可能导致测试失败的空间

但它仍然打印失败


有人知道是什么导致了这种奇怪的行为吗?我上下检查了值,找不到任何原因。非常感谢您的帮助。

语法错误:您不需要单引号:

cat temp | (while read line
do
heading=${line%% *}
echo "'$heading'"

case $heading in
Cell)
echo 'hit cell'
echo $line | awk "{printf '%-20s %15s', $5, `./get.sh $5`}";;
Frequency)
echo 'hit frequency'
echo $line | awk "{gsub('\)', '', $5);printf '%6s', $5 }";;
blah)
echo 'hit blah'
echo $line | awk "{gsub('\"', '', $0);printf '%40s', $1 }";;
*) echo 'fail';;
esac

done)

awk
的所有调用是否与问题无关?你的输入文件是什么样子的?它们应该是我已经单独测试过的。它不会跳到案例陈述中。输入文件是由mac供应商分隔的列表。也许我最初的问题应该包括一个提示:如果我们可以运行脚本和输入文件来重现问题,那么帮助解决问题就容易得多。:)我想我刚刚解决了我自己的问题——因为输入来自标准输入,它在shell中包含“颜色”。在这个例子中,它实际上是从普通词到有色词的比较。。我相信这就是问题所在——尽管我不知道如何“剥离”彩色字符。我在某个地方读到,shell中的颜色是通过一些字符序列实现的,比如]e45,我记不起来了。应该有一个选项可以使用纯输出。是否将
ls
的输出保存到文件
temp
?在S.O.上有关于ls输出着色的转义序列以及如何以编程方式删除它们的答案,但是如果您可以在源代码处将其关闭,那就更干净了。(您是否有可能覆盖普通输出版本的ls`函数或别名?另请参阅我的注释Femi的答案。Good Luck.roight,case按字面意思匹配字符串。输入必须有单引号才能匹配。双引号呢?(我在网上其他地方看到过带有双引号的示例)它正在使用它们(单引号)事实上。我确实相信这是egrep添加的颜色代码。(我猜引号部分一定取决于您拥有的shell解释器。)我同意@aitee;至少在我的bash上,这是不正确的。尝试这个测试:
echo test |在读取行时;在“test”中做case${line}echo匹配test1;;test)回波匹配测试2;;以撒;完成
。我得到了这个输出:
匹配test1
。在评估案例目标之前,单引号会被去掉。好吧,有一些shell细节需要处理:我使用
进行了测试/bin/bash
,但是如果你在Ubuntu上的shell上运行它,你可能会实际执行
dash
或其他一些讨厌的东西,并且处理方式可能会有所不同。但是在Debian lenny盒子上的Bash中,原始代码对我来说不起作用。很高兴知道。我的经验(主要是使用ksh)是,引号不是case目标的evaluted字符串的一部分,除非您需要它们来保护作为case目标一部分的空白字符。我用bash做了一个快速测试,我必须确认我的答案。现在我知道这不是百分之百确定的事情。谢谢分享!