0

这是一个简单的脚本,从实际有用的东西中提炼出来,适用于 Fedora,但不适用于 OS X Lion。

declare -a directory_contents=($(ls .))
test -e ${directory_contents[0]}
echo $?

在 linux 上它返回 0,即 test -e 通过。在 Mac 上,它返回 1。

知道这里可能出了什么问题吗?

4

3 回答 3

4

如果返回的第一个文件ls名称中有空格,${directory_contents[0]}则不会扩展为完整的文件名(仅到第一个空格)。这个条件适用于你的 OSX 测试而不是你的 Fedora 测试吗?

在声明语句之前添加以下行可能会解决问题:

IFS=$'\n'

参考:http ://www.linuxquestions.org/questions/programming-9/bash-passing-arrays-with-spaces-611159/

于 2012-04-16T22:18:57.697 回答
2

尼克的回答是正确的。但是您还应该记住,除了在高度受控的环境中,您ls应该使用文件名来填充变量。还有许多其他方法可以选择单个文件名。

[ghoti@pc ~]$ ls -l foo*
-rw-r--r--  1 ghoti  wheel  0 Apr 16 21:01 foo bar.txt
-rw-r--r--  1 ghoti  wheel  0 Apr 16 21:01 foo.txt
[ghoti@pc ~]$ test1=`for i in foo*txt;do echo $i; break; done`
[ghoti@pc ~]$ echo $test1
foo bar.txt
[ghoti@pc ~]$ test2=`find . -name foo\*.txt -print | head -1`
[ghoti@pc ~]$ echo $test2
./foo.txt
[ghoti@pc ~]$ 

显然,并非所有方法都会以相同的顺序返回文件。

还要注意以连字符开头的文件名。:-)

于 2012-04-17T01:03:06.223 回答
0

我在最初的问题中忽略了澄清的是,我的“脚本”实际上是一个 bash 函数。我的问题的原因是“ls”正在解析为带有“--color = auto”的别名,将不可打印的字符添加到实际文件名中。

始终定义变量以保存脚本中使用的可执行文件的完整路径,例如“LS=/bin/ls”。而且,根据上面的答案, ls 可能不是强大的生产脚本的最佳选择。

于 2012-04-17T14:59:33.143 回答