带有数组的bash脚本适用于linux而非mac os x

时间:2012-04-16 21:24:37

标签: bash

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

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

在linux上它返回0,即test -e pass。在Mac上,它返回1.

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

3 个答案:

答案 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可能不是您选择强大的生产脚本的最佳选择。