在 ksh 中对数组中的每个元素执行一个函数

perform a function on each element in an array in ksh

我的脚本的前一部分有一个变量,它是greped/sed/cut/sort/uniq从前一个脚本输出的多行到我需要的,n 数量的数字数据

echo "$array"
12345
54321
01234

据我了解,我可以将这一列数字视为一个数组

项目的数量可以从 1 到可能多达 6 不等。我已经确认没有可能会导致事情丢失的空格。

从这里我尝试

for element in "{array[@]}"; do

foo $anothervar "$element"

bar $anothervar "$element"

done

但我最终得到了变量中的所有值。

foo $anothervar 12345 54321 01234

(请注意,$anothervar 仅用于演示目的,它实际上是 $1,因此 shell 对那个 var 的扩展 不一定是问题)

等等。如果我

#with double quotes
echo "$element"
12345
54321
01234

#without quotes
echo $element
12345 54321 01234

所以我不能用这些数据做任何迭代。我是否错误地认为我可以将此变量视为一个数组并且必须对 var 执行另一个操作才能将其输入到 for 循环?

我所希望的

foo $anothervar "$element"
*output of $anothervar 12345*

bar $anothervar "$element"
*output of $anothervar 12345*

foo $anothervar "$element"
*output of $anothervar 54321*

bar $anothervar "$element"
*output of $anothervar 54321*

etc etc

这是 AIX 上的 ksh88,根据我的研究,这应该可以工作,除非可能涉及 ksh88 与更高版本?我是数组的新手,但不是 shell 脚本的新手,尽管我很难称自己为专家。在此先感谢您提供的任何帮助。

我没有可用于实验的 ksh88,但使用 ksh93(我正在使用 Version AJM 93u+ 2012-08-01)这将产生类似于您的数据:

$ val=` for ((ii=1; ii<4; ii++))
do
echo $ii
done`

如果我以两种不同的方式重复这一点,我会得到你所看到的开始:

$ echo $val
1 2 3
$ echo "$val"
1
2
3

现在,我添加一个功能

$ function foo {
> echo  
> }

我可以循环遍历这些值,一次一个:

$ for xx in $val
> do
> foo foo $xx
> done
foo 1
foo 2
foo 3

或者全部加在一起(这不是你想要的):

$ for xx in "$val"
> do
> foo foo $xx
> done
foo 1

嘿,我的其他值怎么了? 仔细观察,通过在 $val 周围添加引号,我们一次性将所有值分配给 xx。我们可以通过以下方式更清楚地看到这一点:

for xx in "$val"
do
foo foo $xx
echo "The value of xx=$xx"
echo "or in hex:"
echo "The value of xx=$xx" | xxd -g 1
done
foo 1
The value of xx=1
2
3
or in hex:
0000000: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 78 78 3d  The value of xx=
0000010: 31 0a 32 0a 33 0a                                1.2.3.

xx 的单个值是 1\n2\n3\n(\n 是换行符),当我们将它传递给 foo 函数时,它只会看到第一个值,1。

如果我们稍微更新一下,

for xx in "$val"
do
foo foo "$xx"
done
foo 1 2 3

我们看到单独的值被传递给了函数。由于该函数未引用 $2 参数,因此我们看不到换行符。

这是否回答了您的问题?

我推荐使用 ksh93,因为您不想落后 27 年。 David Korn 从 1993 年开始对 ksh 进行了相当大的更新,这些更新值得付出额外的努力,在 AIX 上键入 ksh93 而不仅仅是 ksh。

Which are you using, var=... or array=( ... ... ...) or ?? Edit your Q to show acompletely testable set of data, along with your required output/actions (yes you are close). I would try for elem in ${var[@]} ; do ...` (no dbl-quotes). Good luck.

谢谢@shellter,双引号确实是问题所在。我假设,因为我在此处的先前答案中发现它必须是更新版本的 ksh 的有效语法,但今天您解决了我的问题,我感谢所有提供建议的人。