2013-11-25 31 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命令不會影響您的當前目錄。