Как передать список функции в скрипте KornShell? - PullRequest
2 голосов
/ 03 ноября 2011

Мне нужно передать список в функцию 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 ]

3 голосов
/ 04 ноября 2011

Если вы запустили 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 голос
/ 03 ноября 2011

2 вещи

Передайте свой список в dbl-кавычках, т.е.

print_list "${LogFile}"

Также используйте переменную 'all elements' ($ {@}) в вашей функции (естьвероятно, лучшее имя для этого).

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

(вам может понадобиться убрать dbl-кавычки вокруг ${@}.

Обратите внимание, что $(Files) должно быть $( echo ${Files} )

Кроме того, если в именах файлов есть пробелы, это потребует дальнейшей работы. Это широко обсуждается здесь на SO, поэтому не бойтесь искать 'find printf0' для некоторых подходящих решений.

Надеюсь, это поможет.

...