将参数作为字符串传递给shell脚本中的函数

时间:2015-10-10 14:46:22

标签: function shell ksh

在另一个脚本中调用一个函数来删除旧文件 - 需要将$ 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`

}

3 个答案:

答案 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*'