2016-04-29 112 views
0

我正在嘗試創建一個新文件夾,輸入的副本,然後tar該文件夾的內容。我想不通爲什麼 - 但似乎,而不是搜索我的新創建的目錄中的內容 - 這是我的搜索整臺電腦...返回線,如在shell腳本中訪問新創建的目錄

/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Sine/Sine - Vocal 1.raw is a file 
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Sine/Sine - Vocal 2.raw is a file 
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Sine/Triangle - Arp.raw is a file 
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Sine/Triangle - Asym 4.raw is a file 
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Sine/Triangle - Eml.raw is a file 
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Square is a folder 
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Square/Square - Arp.raw is a file 
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Square/Square - Bl Saw.raw is a file 

你們可以發現一個簡單的錯誤?

順便說一句,我知道tar腳本還沒有出現,但一旦我可以導航新文件夾,這將很容易。

#!/bin/bash 

##--- deal with help args ------------------ 
## 

print_help_message() { 
    printf "Usage: \n" 
    printf  "\t./`basename $0` <input_dir> <output_dir>\n" 
    printf "where\n" 
    printf  "\tinput_dir : (required) the input directory.\n" 
    printf  "\toutput_dir : (required) the output directory.\n" 
} 

if [ "$1" == "help" ]; then 
    print_help_message 
    exit 1 
fi 

## ------ get cli args ---------------------- 
## 


if [ $# == 2 ]; then 
    INPUT_DIR="$1" 
    OUTPUT_DIR="$2" 
fi 


## ------ tree traversal function ----------- 
## 

mkdir "$2" 
cp -r "$1"/* "$2"/ 

## ------ return output dir name ------------ 
## 

return_output_dir() { 
    echo $OUTPUT_DIR/$(basename $(basename $(dirname $1))) 
} 


bt() { 
    output_dir="$1" 
    for filename in $output_dir/*; do 
     if [ -d "${filename}" ]; then 
      echo "$filename is a folder" 
      bt $filename 
     else 
      echo "$filename is a file" 
     fi 
    done 
} 

## ------ main ------------------------------ 
## 

main() { 
    bt $return_output_dir 
    exit 0 
} 


main 
} 
+0

加入問題,您怎麼稱呼命令 – sjsam

回答

1

好了,我可以告訴你爲什麼它這樣做,但我不是什麼它應該做清楚,所以我不知道如何解決它。直接的問題是return_output_dir是一個函數,而不是一個變量,所以在命令bt $return_output_dir$return_output_dir部分擴展到...什麼也沒有,bt得到運行沒有參數。這意味着在bt中,output_dir設置爲空字符串,因此for filename in $output_dir/*將變爲for filename in /*,它會遍歷引導捲上的頂級項目。

有許多其他的事情that're混亂/古怪這個代碼:

  • 功能main()似乎沒有任何作用 - 一些主線代碼是外它(特別是,參數解析的東西),一些裏面,沒有明顯的原因。在某些語言中需要使用main函數,但在shell腳本中,只需將主代碼內聯即可。 (另外,功能不應該exit,他們應該return。)

  • 您有一個名爲既OUTPUT_DIRoutput_dir變量。使用不同的名稱。此外,通常最好堅持使用小寫(或混合大小寫)變量名稱,以避免與shell和其他程序使用的變量衝突。

  • 您複製$1$2INPUT_DIROUTPUT_DIR,然後繼續使用$1$2,而不是您剛纔複製他們到更清晰命名變量。

  • output_dir在遞歸函數中發生了變化,但未聲明爲local;這意味着bt的內部調用將改變外部可能嘗試使用的值,導致怪異。聲明函數局部變量爲local以避免麻煩。

  • $(basename $(basename $(dirname $1)))沒有意義。假設$1是「/ foo/bar/baz/quux」:則dirname $1返回/foo/bar/baz,basename /foo/bar/baz返回「baz」,並且basename baz返回「baz」。第二個basename沒有做任何事情!無論如何,我很確定整個事情並沒有達到你期望的水平。

  • bt應該遞歸到什麼目錄?你怎麼稱呼它沒有任何提及INPUT_DIROUTPUT_DIR

  • 通常,您應該將變量引用放在雙引號中(例如for filename in "$output_dir"/*bt "$filename")。你在一些地方這樣做,但不是其他地方。

+0

嗨戈登,感謝您的詳細解答。它應該通過新創建的OUTPUT_DIR進行遞歸。 –

+0

@VincentRodomista在這種情況下,我只是簡單地移除'main'和'return_output_dir',並在腳本的末尾放置'bt「$ OUTPUT_DIR」(除了您應該將OUTPUT_DIR更改爲其他名稱)。此外,使用[shellcheck.net](http://www.shellcheck.net) - 它會爲您捕捉很多基本錯誤。 –