重复将函数应用于列表并将输出累积到字符串中

时间:2017-06-03 00:20:22

标签: bash

我有一个函数,根据对此的一些测试,XO采用1个整数参数,就像这个简单的is_even函数一样:

function is_even {
  if [ $(( $1 % 2)) -eq 0 ]; then echo "O";
  else echo "X";
  fi 
}

现在我想为某个列表中的每个项目调用此项,并生成包含所有答案的字符串。因此,如果我将其称为列表1,5,2,8,7,我想要字符串X X O O X

基本上这是地图功能x - > is_even(x)应用于列表。

我现在使用的是

result=""
for i in {1..10}; do
 result+="$(is_even $i) " 
done

这似乎给出了正确的输出,但想知道是否有更规范或简洁的方法来做到这一点。

1 个答案:

答案 0 :(得分:1)

这里的“规范”或“简洁”部分是在旁观者的眼中。

作为显式for循环的替代方法,我们可以使用xargs。第一步是确保导出is_even shell函数:

$ export -f is_even

现在,我们可以创建一个结果数组:

$ arr=($(echo {1..10} | xargs -n1 bash -c 'is_even $1' Even))

我们可以验证arr是否具有正确的值:

$ echo "${arr[@]}"
X O X O X O X O X O

功能

测试[ $(( $1 % 2)) -eq 0 ]不必要地复杂化。该功能的另一种形式是:

even() { if (( $1 % 2)); then echo X; else echo 0; fi; }

这是有效的,因为算术评估((...))如果结果非零则返回true,否则返回false。

另外,因为这是一个好习惯,我们在这里使用了POSIX形式的函数定义。 function关键字是不可移植的。