【问题标题】:Passing arguments as strings to a function in a shell script将参数作为字符串传递给 shell 脚本中的函数
【发布时间】:2016-01-08 09:41:31
【问题描述】:

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

}

【问题讨论】:

  • 你想做什么?所有参数都作为字符串传递。

标签: function shell ksh


【解决方案1】:

看起来您想按原样传递/usr/tmp/AB*,而不扩展它。这可以通过'/usr/tmp/AB*'、"/usr/tmp/AB*" 或/usr/tmp/AB\* 完成。

然后,为了确认你得到了正确的值,你需要使用"$1"来防止echo中的通配符扩展:

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

deletefiles '/usr/tmp/AB*' 1

【讨论】:

    【解决方案2】:

    我猜您的主要问题是您希望 AB* 在 deletefiles() 中展开。 不做特别的事情时,怎么找到最后一个参数?

    您可以使用 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 中时,您的 homedir 中的 access.log 将被发现。在本地计算机上使用完整路径!

    【讨论】:

      【解决方案3】:

      如果可以避免,不要使用 eval:find 确实有一个 -name 选项来指定文件掩码,例如:

      deletefiles () {
          find "$1" -name "$2" ...
      }
      
      deletefiles /somedir 'AB*'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-24
        • 2014-08-12
        • 2016-08-08
        • 1970-01-01
        • 1970-01-01
        • 2022-12-09
        • 1970-01-01
        相关资源
        最近更新 更多