Linux Bash Shell學習(十):流程式控制制——for

來源:互聯網
上載者:User

  本文也即《Learning the bash Shell》3rd Edition的第五章Flow Control之讀書筆記之二,但我們將不限於此。flow control是任何程式設計語言中很常用的部分,也包括了bash。在這裡,我們將繼續學習他們。

  和C不一樣的是,在shell中是匹配list中的元素,因此非常適合用於命令的參數,檔案清單。for格式如下:

for name  [in list ]
do
    statements that can use  $name...
done

  我們通過下面的例作進一步學習。一共設定了三個例子

# Test for the bash loop : for method
#
# Test 1: 顯示$PATH中各個具體路徑的詳細資料

function getpath
{
    # 設定分割符號為“:”,預設為空白格

    IFS=:

    # for測試,其中ls -ld中的-d表示之顯示目錄的屬性,不顯示目錄下屬的檔案。

    for dir in $PATH
    do
        ls -ld $dir
    done


}

# 通常$PATH中包含~/bin目錄,一般不存在,在ls的顯示中會報告錯誤,需要挑出進行處理。同時我們增加一個空的元素來進行分析。

function getpath1
{
    path=$PATH::
    echo check : $path
    IFS=:

    for dir in $path
    do
        # 如果是空元素,將其轉換為目前的目錄。

        if [ -z $dir ] ; then    dir=. ; fi
        if ! [ -e $dir ]; then
            echo "$dir is not exist!"
        elif ! [ -d $dir ]; then
            echo "$dir is not a directory!"
        else
            ls -ld $dir
        fi
    done
}

#echo 'run getpath'
#getpath

echo 'run getpath1'
getpath1

# Test 2 顯示指定檔案的是否是有效檔案名稱

function finfo
{
    if ! [ -e "$1" ]; then
        echo "$1 is not an availble file."
    else
        echo "$1 is a file."
    fi
}

echo 'run fileinfo'
# 如果命令沒帶參數,即list為空白,則不執行for裡面的代碼

for filename in $@; do
    echo "in for loop..."
    finfo "$filename"
done

  下面是一個遞迴的例子,我們希望將目錄下的檔案也顯示出來。根據階層,下一級比上一級向後挪一個tab。

# Test 3: 顯示目錄下的檔案,採用遞迴方式 。showdirfile 表示顯示所在目錄的所有檔案,如果也是目錄,遞迴執行。為了記錄方便,將注釋載入命令列後面,注意這隻是為了閱讀方便,而不是shell應有的文法。

function showdirfile

      #step1
:只有是有效目錄檔案,才search 
 
      if [ -d $1 ] ; then 
        #step2
,比上一級後退tab,記錄前面tab的字元

        currenttab+="/t"
        #$(command <command>)

用於給出command的輸出結果,作為字串。
        #step 3
:搜尋ls <dir_name>所顯示的entry,如果是檔案,顯示,如果是字串顯示,並在後面加上"/",表明是目錄,使用遞迴,檢索該目錄下的檔案。

        for file in $(command ls $1);
do
            echo -e -n ${currenttab}$file
            #step 4:
檔案的含路徑名字為$1/$file,由於我們沒有採用cd $file,即沒有進入該目錄進行訪問,因此要記錄path,如果是目錄,用dir記錄下這個子目錄的名字

            if [ -d $1/$file ]; then
                echo "/"
                showdirfile $1/$file
            else
                echo
            fi
        done
        #step2
,執行完推出,恢複上一級的前面的tab字串,即去掉最後的/t。

        currenttab=${currenttab%"/t"}
    # end of step 1

    fi
}
# 之前設定了IFS,會使得ls的輸出不是以空格為分割,異常,需要重設它

unset
IFS
echo 'run file architechture'
showdirfile ${1:-"~"}

相關連結: 我的Linux操作相關文章

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.