我是 shell 和 UNIX / GNU/Linux 的新手。
我试图理解作为递归函数一部分的语法:
[ $i -le 2 ] && echo $i || { f=$(( i - 1)); f=$(factorial $f); f=$(( f * i )); echo $f; }
(取自这里)
完整的相关函数是:
factorial(){
local i=$1
local f
declare -i i
declare -i f
[ $i -le 2 ] && echo $i || { f=$(( i - 1)); f=$(factorial $f); f=$(( f * i )); echo $f; }
}
我理解[$i -le 2 ]
意味着检查是否至少有 2 个位置参数,我只是不明白什么是双管符号(或?)。还有做什么的{}
?它们是 4 个参数的 for 循环吗?
谢谢,大卫
答案1
第一的,
local i=$1
将 $1 的值赋给 i。 $1 是函数的第一个参数。或者在函数之外,它代表命令或脚本的第一个位置参数。
下面这些都是很直观的。 -i 表示变量是整数。
local f
declare -i i
declare -i f
现在来说说长篇。为了清楚起见,我将把它分成单独的行。
[ $i -le 2 ] #checks if $i is less or equal 2
&& #this is logical AND. This is used so: X && Y, meaning if X computes to true, then compute Y. So for this function, the meaning is: if $i less or equals 2, do the following:
echo $i #this follows the logical && above, so is computed conditionally. Namely, print $i.
|| #this is logical OR, so what follows is computed only if what's on the left boils down to false.
#Here the meaning is, IF NOT $i -le 2 AND echo... (which doesn't matter), do what's on the right. So do what's in the {} braces, if $i is greater than 2.
现在只剩下这个了:
{ f=$(( i - 1)); f=$(factorial $f); f=$(( f * i )); echo $f; }
大括号 {} 使其中的内容成为一个块,该块被视为一个实体。为了最简单地解释这里出现的情况,前面介绍过 && 和 || 的逻辑。现在适用于整个块。现在到零件。
f=$(( i - 1));
$(( )) 是算术运算符。 f=你现在应该知道了。整个表达式的意思是赋值给f
的值i - 1
。
请注意块的各个部分如何以分号结束;
。
f=$(factorial $f);
上面调用了该函数。这就是递归的地方。字面意思:分配给以为参数f
调用的函数阶乘的返回值。 $f
(您可能已经注意到,赋值不需要 $。$( )
)命令替换。您可以通过简单地调用函数的名称来调用函数,但是对于变量值赋值,必须以某种方式传递该值,这就是这里的完成方式。
f=$(( f * i ));
上面您再次看到算术运算符,即$(( ))
。f
此处获取 的值f
,此时该值等于$(factorial $f)
乘以i
,等于函数的 $1 参数。
最后,打印 的值f
:
echo $f;
答案2
||
逻辑或
{}
函数或命令集的开始-结束
for
3 个参数:初始化、条件、迭代器更改
{ f=$(( i - 1)); f=$(factorial $f); f=$(( f * i )); echo $f; }
内联函数返回一个数字