2016-11-27 2 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 является Глоб шаблон не регулярное выражение, и вы должны передать его цитировал и использовать кавычки внутри присваивание, чтобы предотвратить расширение оболочки
  3. Не используйте все прописные имена переменных, чтобы избежать столкновения с Shall внутренние переменные окружения.
  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 
Смежные вопросы