2016-11-27 103 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 
相关问题