2014-02-13 167 views
0
#!/bin/bash 

traverse() { 
local x=$1 
if [ -d $x ] 
then 
lst=(`ls $x`) 
for((i=${#lst[@]}; --i;)); do 
    echo "${lst[i]}" 
    done 
else echo "not a directory" 
fi 
} 

traverse 

我希望在執行程序時傳遞一個參數,比如「/路徑/到/本/目錄/」,但如果我在同一目錄作爲我的bash腳本文件,運行該程序只能和我通過的任何其他參數完全被忽略。bash傳遞參數/參數?

該腳本應該採取一個參數,並檢查它是否是一個目錄,如果它是一個目錄,然後按降序列出所有的文件/文件夾。如果不顯示錯誤消息。

代碼有什麼問題,謝謝!

回答

3

發生這種情況是因爲$1在函數中是指traverse的參數,而不是腳本的參數。

要與每個參數運行一次你的功能,使用

for arg in "[email protected]" # "[email protected]" is also the default, so you can drop the 'in ..' 
do 
    traverse "$arg" 
done 

如果在未來要將所有腳本的參數傳遞給一個函數,使用

myfunc "[email protected]" 

這僅僅是個問題儘管如此。其他問題包括不引用您的變量和使用命令擴展ls,而不是globs,lst=("$x"/*)

+0

@ [那個人]感謝非常有幫助的信息!現在按我的預期運行! – user3016065

3

您不需要爲此調用ls。您可以使用此代碼:

traverse() { 
    local x="$1" 
    if [ -d "$x" ]; then 
     arr=("$x/"*) 
     for ((i=${#arr[@]}; i>0; i--)); do 
      echo "${arr[$i]}" 
     done 
    else 
     echo "not a directory" 
    fi 
} 
0

「那個男人」有正確的答案。它總是着眼於當前目錄的原因:

  1. 調用traverse不帶參數
  2. 在遍歷功能$1是空的,因此$x是空
  3. 測試因此[ -d ],當[給出1個參數,如果參數不爲空則返回成功。你if命令始終執行「真正的」塊ls $x只是ls當x是空

使用[[ ... ]]使用bash:它是關於空參數聰明。否則,引用你的變量:

$ x=; [ -d $x ] && echo always true || echo not a directory 
always true 
$ x=; [[ -d $x ]] && echo always true || echo not a directory 
not a directory 
$ x=; [ -d "$x" ] && echo always true || echo not a directory 
not a directory