我需要将列表传递给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
当我尝试只运行列表中的第一个元素时会被打印出来。有什么建议吗?
答案 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”。
我希望这会有所帮助。