我有一个接受多个参数的函数。我也传递一个带有正则表达式的字符串。但当它变得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
文件替换。
对此有何解决方案?
答案 0 :(得分:4)
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