这是一个简单的脚本,从实际有用的东西中提炼出来,适用于Fedora但不适用于OS X Lion。
declare -a directory_contents=($(ls .))
test -e ${directory_contents[0]}
echo $?
在linux上它返回0,即test -e pass。在Mac上,它返回1.
知道这里可能出现什么问题吗?
答案 0 :(得分:4)
如果ls
返回的第一个文件名称中有空格,${directory_contents[0]}
将不会扩展为完整文件名(仅限第一个空格)。这种情况是否适用于您的OSX测试,而不适用于您的Fedora测试?
在declare语句之前添加以下行可能会解决问题:
IFS=$'\n'
参考:http://www.linuxquestions.org/questions/programming-9/bash-passing-arrays-with-spaces-611159/
答案 1 :(得分: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 ~]$
显然,并非所有方法都会以相同的顺序返回文件。
还要注意以连字符开头的文件名。 : - )
答案 2 :(得分:0)
我在原始问题中忽略的是我的“脚本”实际上是一个bash函数。我的问题的原因是“ls”正在解析为“--color = auto”的别名,在实际文件名中添加了不可打印的字符。
始终定义变量以保存脚本中使用的可执行文件的完整路径,例如“LS = / bin / ls”。并且,根据上面的答案,ls可能不是您选择强大的生产脚本的最佳选择。