2016-11-27 104 views
1

我有一個接受多個參數的函數。我也正在傳遞一個正則表達式的字符串。但是當它得到eval使用其他參數越來越混亂。如何將正則表達式傳遞給函數

代碼就像下面 -

function foo() { 
    eval DIR_NAME='$'$1 
    MAX_DEPTH=$2 
    eval FILE_PATTERN=$3 
    RETENTION_PERIOD=$4 
    eval MOVE_PATH='$'$5 
    find . -maxdepth "$MAX_DEPTH" -type f -name "$FILE_PATTERN" -mtime +"$RETENTION_PERIOD" -print | ... 
} 

DIR_NAME="/my/path" 
MAX_DEPTH=2 
FILE_PATTERN="*.txt" 
RETENTION_PERIOD=30 
TARGET_DIRECTORY="/move/to/path" 

foo DIR_NAME $MAX_DEPTH $FILE_PATTERN $RETENTION_PERIOD TARGET_DIRECTORY 

現在的問題是在find命令$FILE_PATTERN是越來越擴大,並與所有.txt文件的路徑和RETENTION_PERIOD用自己取代,MOVE_PATH變量得到其他.txt取代文件。

任何解決方案?

回答

4
  1. 這裏沒有必要使用eval這裏。使用BASH的間接變量參考。
  2. *.txt是glob模式不是正則表達式,你應該把它傳遞報價和分配內使用引號,以防止shell擴展
  3. 不要使用所有大寫的變量名,以避免應的內部環境變量衝突。
  4. 在函數內部使用local來定義局部變量以避免覆蓋全局變量。

您可以使用:

foo() { 
    local dir_name="${!1}" 
    local max_depth="$2" 
    local file_pattern="$3" 
    local retention_period="$4" 
    local move_path="${!5}" 

    find . -maxdepth "$max_depth" -type f -name "$file_pattern" -mtime +"$retention_period" -print | ... 
} 

然後稱其爲:

dir_name="/my/path" 
max_depth=2 
file_pattern='*.txt' 
retention_period=30 
target_directory="/move/to/path" 

foo dir_name "$max_depth" "$file_pattern" "$retention_period" target_directory 
相關問題