我有一个函数,根据对此的一些测试,X
或O
采用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
这似乎给出了正确的输出,但想知道是否有更规范或简洁的方法来做到这一点。
答案 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
关键字是不可移植的。