如何将正则表达式传递给函数

时间:2016-11-27 13:01:04

标签: regex bash shell

我有一个接受多个参数的函数。我也传递一个带有正则表达式的字符串。但当它变得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_PERIODMOVE_PATH变量被其他.txt文件替换。

对此有何解决方案?

1 个答案:

答案 0 :(得分:4)

  1. 此处无需使用eval。使用BASH的间接变量引用。
  2. *.txt是一个不是正则表达式的glob模式,你应该引用它并在赋值中使用引号以防止shell扩展
  3. 不要使用所有大写变量名来避免与should的内部环境变量发生冲突。
  4. 在函数内部使用local来定义局部变量,以避免覆盖全局变量。
  5. 您可以使用:

    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