2013-11-25 26 views
0

还有的在shell脚本下面的部分,我正在写:不同的行为在bash字符串比较,而在函数内部

(查看最新的目录中someDir这是不summary/

latestDirName="" 
for dirName in `ls -lt /user/someDir/ | head -3 | tail -n +2 | awk '{print $9}'` 
    do 
    if [ "$dirName" == "summary" ]; then 
     continue 
    fi 
    latestDirName=$dirName 
    done 

这里$dirname抵抗串summary比较,而dirName变量的迭代期间的回波将打印为summary/

该比较当代码写入文件并执行时,部分工作正常。

但是,一旦这个相同的代码放入一个函数并放在我的bashrc中,在if检查中的比较似乎不起作用!

这是否与字符串是一个目录名称有关,或者它有/
当相同的代码在一个函数内时,它会产生什么不同?

代码内的bashrc:

findLatestDir() 
{ 
    latestDirName="" 
    for dirName in `ls -lt /user/someDir/ | head -3 | tail -n +2 | awk '{print $9}'` 
    do 
     if [ "$dirName" == "summary" ]; then 
     continue 
     fi 
     latestDirName=$dirName 
    done 
} 

脚本被称为如下:
情况#1(在文件中的代码):$ ./findLatestDir.sh
情况#2(在bashrc中功能):$ findLatestDir

+0

'继续'对我来说没有意义 – hek2mgl

+0

请发布代码,演示如何创建和调用函数,并演示您正在观察的错误行为。 – chepner

+0

hek2mgl为什么? chepner更新了问题的完整细节 – eternalthinker

回答

2

也许你的.bashrc中有ls的别名或函数定义,它与函数中使用的ls的交互性很差?如果是这样,在函数中明确说明/bin/ls可能会解决问题。

+0

接受这个答案,因为它直接解决了手头的问题 – eternalthinker

1

Parsing ls is never a good idea。改为使用stat:打印出历元修改时间,按降序排列数字,然后找到不是“汇总”的第一个目录。

findLatestDir() (
    cd /some/dir 
    stat -c $'%Y\t%n' */ | 
    sort -rn | 
    cut -f2 | { 
     while read dir; do 
      [[ $dir == "summary/" ]] || break 
     done 
     echo $dir 
    } 
) 

注意的是bash通配符*/与后目录将结果限制为仅目录。

我在子shell中执行函数,所以cd命令不会影响您的当前目录。