如何将正则表达式传递给函数
问题描述:
我有一个接受多个参数的函数。我也正在传递一个正则表达式的字符串。但是当它得到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
取代文件。
任何解决方案?
答
- 这里没有必要使用
eval
这里。使用BASH
的间接变量参考。 -
*.txt
是glob模式不是正则表达式,你应该把它传递报价和分配内使用引号,以防止shell扩展 - 不要使用所有大写的变量名,以避免应的内部环境变量冲突。
- 在函数内部使用
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