在另一个脚本中调用一个函数来删除旧文件 - 需要将$ 1作为字符串传递,而不是传递该arg的eval(来自目录的文件列表)
尝试过: - echo $ 1附近的单引号和双引号(“$ 1”,“$ 1”) - 围绕arg的单引号和双引号(“/ 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 :(得分: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
答案 1 :(得分:0)
我猜你的主要问题是你想要在deletefiles()中扩展AB *。 当你没有做一些特别的事情时,你如何找到最后一个参数?
您可以使用eval在deletefiles()中扩展通配符,但是eval可以执行超出您想要的操作。另一种方法是在您将参数分配给变量时,使用参数的顺序(第一天)结束使用shift
来删除参数列表中的天数。
我会展示两种解决方案。
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*
时,您正站在$ HOME中访问.log在你的homedir将被发现。使用本地计算机上的完整路径!
答案 2 :(得分:0)
如果可以避免,请不要使用 eval : find 确实有 -name 选项来指定文件掩码,例如:
deletefiles () {
find "$1" -name "$2" ...
}
deletefiles /somedir 'AB*'