如何将列表传递给KornShell脚本中的函数?

时间:2011-11-03 17:27:03

标签: shell unix scripting aix

我需要将列表传递给KornShell(ksh)函数,如下所示:

#!/bin/ksh

print_list ()
{
        Files=$1

        for file in $(Files);do
                echo $file
        done
}

LogFiles=`find . -type f -name "*.log"`

print_list $LogFiles

当我尝试只运行列表中的第一个元素时会被打印出来。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

如果您碰巧运行ksh93而不是ksh88,则可以使用该语法处理文件/目录名称中的嵌入空格:

#!/bin/ksh

function print_list
{
  eval "a=( \"\${$1[@]}\" )"
  for file in "${a[@]}";do
    echo $file
  done
}

IFS=$'\n' LogFiles=( $(find . -type f -name "*.log") )
print_list LogFiles

这是一种ksh88方式,仍然使用数组和处理空格:

#!/bin/ksh

function print_list
{
  i=1
  while [ $i -lt $2 ]
  do
    file=$(eval echo \${$1[$i]})
    echo file=$file
    i=$((i+1))
  done
}

(
  IFS="
  "
  i=1
  find . -type f -name "*.log" |
  while read l
  do
    LogFiles[$i]=$l
    i=$((i+1))
  done
  print_list LogFiles $i
)

答案 1 :(得分:1)

2件事

在dbl-quotes中输入你的列表,即

print_list "${LogFile}"

在你的函数中也使用'all elements'变量($ {@})(这可能是一个更好的名字)。

print_list ()
{   
        for file in "${@}";do
                echo $file
        done
}

(您可能需要删除${@}周围的dbl引号。

请注意$(Files)需要$( echo ${Files} )

此外,如果文件名中有空格,则需要进一步处理。它在S.O.上被广泛讨论,因此不要害怕为某些适当的解决方案搜索“find printf0”。

我希望这会有所帮助。