2015-10-10 2 views
0

Вызов функции в другом сценарии, чтобы удалить старые файлы - нужно передать $ 1 в виде строки, а не Eval этого арг (список файлов из каталога)Передача аргументов в виде строки в функцию в сценарии оболочки

Пытались : - одиночные и двойные кавычки вокруг эхо $ 1 ("$ 1", '$ 1') - одиночные и двойные кавычки вокруг арг ("/ TMP/AB *", '/ TMP/AB *')

Прочитали 3 аналогичных вопроса здесь, но безуспешно при понимании проблемы ...

AIX 6

#!/bin/ksh 
#### common load function ###### 
. /tmp/functions.sh 

deletefiles /usr/tmp/AB* 1 

#!/bin/sh 
# Deletes files from a filelist that are older than X days 

deletefiles() { 

echo $1 
echo $2 

#filelist=$1 
#days=$2 

#execute 
#`find ${filelist} -type f -mtime +${days} -exec rm {} + 2>&1` 

} 
+0

Что вы пытаетесь сделать? Все аргументы передаются как строки. – melpomene

ответ

0

Похоже, вы хотите пройти /usr/tmp/AB* как есть, без его расширения. Это можно сделать с помощью '/usr/tmp/AB*', "/usr/tmp/AB*" или /usr/tmp/AB\*.

Затем, чтобы подтвердить, что вы получили правильное значение, вам нужно использовать "$1", чтобы предотвратить расширение подстановочных в echo:

deletefiles() { 
    echo "$1" 
    echo "$2" 
} 

deletefiles '/usr/tmp/AB*' 1 
0

Я думаю, ваша главная проблема в том, что вы хотите AB * расширен в deletefiles() , Когда вы не делаете что-то особенное, как вы находите последний параметр?

Вы можете развернуть шаблон в файле deletefiles() с помощью eval, но eval может делать больше, чем вы хотели. Другой метод заключается в том, чтобы изменить порядок ваших параметров (первые дни), использовать shift для удаления дней из paramaterlist, когда вы назначили его var.

Я покажу оба решения.

deletefiles_notsecure() { 
     filelist="$(eval echo $1)" 
     days=$2 
     echo "Filelist: $filelist" 
     echo "Days: $days" 
} 

deletefiles_secure() { 
     days=$1 
     shift 
     filelist="$*" 
     echo "Filelist: $filelist" 
     echo "Days: $days" 
} 

# deletefiles /usr/tmp/AB* 1 
deletefiles_notsecure "/tmp/*" 1 
echo =========== 
deletefiles_secure 1 /tmp/* 

Как вы можете видеть, вторая форма может быть использована без кавычек от абонента, так что будет проще в использовании.
Примечание: оно будет расширяться во время вызова по отношению к пути, в котором вы находитесь. Когда deletefiles_secure() начинается с cd "${logdir}", и вы стоите в своем домашнем доме, когда вы вызываете deletefiles_secure 1 access*.log*, будет найден access.log в вашем homedir , Используйте полные пути на своем локальном компьютере!

0

Не используйте Eval если вы можете избежать его: найти действительно есть вариант -name указать файл-маску, например:

deletefiles() { 
    find "$1" -name "$2" ... 
} 

deletefiles /somedir 'AB*'