2011-03-21 48 views
3

好的,突然间发生了一些有趣的事情。这个测试bash test yield“echo:command not found”

for i in `cat /mnt/usb/liste.txt `; do [ -f /mnt/usb/lsdvd.xml/$i ] || echo $i; done 

用于正常工作(在文件中每个项目liste.txt试图找到相应的目录,打印的名称,如果没有找到),并用来产生目录缺少的名字。现在,这个命令产量

 echo: command not found 
 echo: command not found 
 echo: command not found 
(...) 

我使用[[...]]和而不是“[..]”,但无济于事“测试”已经试过。

任何想法可能发生在我心爱的bash,而我没有看:) :)?

谢谢, 基督徒。

编辑(设置-x输出):

(...) 
+ for i in '`cat /mnt/usb/liste.txt`' 
+ '[' -f /mnt/usb/lsdvd.xml/THE_GHOST_WRITER.lsdvd.xml ']' 
+ for i in '`cat /mnt/usb/liste.txt`' 
+ '[' -f /mnt/usb/lsdvd.xml/THE_IMAGINARIUM_OF_DOCTOR_PARNASSUS.lsdvd.xml ']' 
+ for i in '`cat /mnt/usb/liste.txt`' 
+ '[' -f /mnt/usb/lsdvd.xml/THE_INFORMANT.lsdvd.xml ']' 
+ for i in '`cat /mnt/usb/liste.txt`' 
+ '[' -f /mnt/usb/lsdvd.xml/THE_INTERNATIONAL.lsdvd.xml ']' 
+ for i in '`cat /mnt/usb/liste.txt`' 
+ '[' -f /mnt/usb/lsdvd.xml/THE_MEN_WHO_STARE_AT_GOATS.lsdvd.xml ']' 
+ for i in '`cat /mnt/usb/liste.txt`' 
+ '[' -f /mnt/usb/lsdvd.xml/THE_OTHER_MAN.lsdvd.xml ']' 
+ for i in '`cat /mnt/usb/liste.txt`' 
+ '[' -f /mnt/usb/lsdvd.xml/THE_QUEEN.lsdvd.xml ']' 
+ for i in '`cat /mnt/usb/liste.txt`' 
+ '[' -f /mnt/usb/lsdvd.xml/THE_READER.lsdvd.xml ']' 
+ for i in '`cat /mnt/usb/liste.txt`' 
+ '[' -f /mnt/usb/lsdvd.xml/THE_REBOUND.lsdvd.xml ']' 
+ $'\302\240echo' THE_REBOUND 
+ '[' -x /usr/lib/command-not-found ']' 
+ /usr/bin/python /usr/lib/command-not-found -- $'\302\240echo' 
 echo: command not found 
+ return 127 
(...) 
+0

有你尝试双引号'$ i'? – 2011-03-21 17:47:54

+0

如果用'echooooo $ 1替换行的末尾;完成',它会给出一个错误'echooooo:command not found'?那个“command not found”错误是我在bash命令提示符下输入垃圾时得到的。如果你用'/ bin/echo'替换它会怎么样? – 2011-03-21 17:56:51

+1

将'set -x'添加到脚本的顶部,并观察shell执行的每条命令。 – bobbogo 2011-03-21 18:17:09

回答

0

时只要运行会发生什么:

for i in `cat /mnt/usb/liste.txt `; do 
    echo $i 
done 

一件事,你注意到任何异常有关的文件名(空格,换行,特殊字符等)?如果是这样,你将需要引用文件名以防止shell解释错误。

另外,尝试使用普通if语句,而不是逻辑的OR:

for i in `cat /mnt/usb/liste.txt `; do 
    if [ ! -f /mnt/usb/lsdvd.xml/$i ]; then 
     echo $i 
    fi 
done 
+0

简单的for-echo-done循环工作正常,文件名没有什么不寻常的。实际上,它们相当不错:没有空格,甚至没有数字。 – Christian 2011-03-22 09:54:12

+0

for-if-then-fi-done循环正常工作,所以它必须是关于||的东西。和奇怪的没有引号的字符串,但我似乎无法找到关于这些文件和它们的名字的任何异常。 – Christian 2011-03-22 09:55:17

2

编辑:下面的代码仍然是好的,但问题可能是在$'\302\240echo':好像有未知字符在你的文本文件中。尝试在echo之前删除几个字符,然后再次输入。

很可能是引用问题。此外,您可以通过避免useless use of cat节省一些时间:

while IFS= read -r; do [ -f "/mnt/usb/lsdvd.xml/$REPLY" ] || echo "$REPLY"; done < /mnt/usb/liste.txt 
0

工作对我来说:

for f in $(< d2.lst); do [ -f ./d2/$f ] || echo $f ; done 

只是我自己的文件名,目录,并提出构建$(...),而不是反引号,并用<代替猫。

也许你的列表中的DOS/Windows换行符?用less查看。

11

如果你仔细观察,你会看到它的打印:

echo: command not found 

与领先的空间,而不是:

echo: command not found 

set -x使这更清楚时,它打印:

$'\302\240echo' THE_REBOUND 

0302 0240是八进制UTF-8的一个non-breaking space

尝试删除|echo之间的空格并键入正常空格。


机会是,该文件是一台Mac,在那里,如果你同时按下选项空间非打破空间可能会被意外进入上编辑。

如果您使用的是Vim,可以使用listchars option使非破坏性空间更加明显。例如:

set listchars+=nbsp:% list 

请参阅Making Vim highlight suspicious characters了解更多的想法。

在Linux上,非换空间或者是撰写空间空间按Ctrl ++ü一个 ,所以你可能不会打字那是意外。


任何有兴趣,有可能使用从UTF-8维基百科文章的UTF-8 table八进制字节手动转换为UTF-8。

但是,到目前为止我发现最简单的方法使用Python是:

>>> import unicodedata 
>>> unicodedata.name('\302\240'.decode('utf-8')) 
'NO-BREAK SPACE'