繁体   English   中英

具有数组的bash脚本在Linux上无法在Mac OS X上运行

[英]bash script with array works on linux not on mac os x

这是一个简单的脚本,摘录自实际有用的东西,可在fedora上使用,但不适用于OS X Lion。

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

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

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

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

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

IFS=$'\n'

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

尼克的答案是正确的。 但是您还应该记住,除非在高度受控的环境中,否则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 ~]$ 

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

另外请注意以连字符开头的文件名。 :-)

我在最初的问题中忽略了要澄清的是,我的“脚本”实际上是bash函数。 我的问题的原因是“ ls”使用“ --color = auto”解析为别名,在实际文件名中添加了无法打印的字符。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM