저는 쉘과 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개입니까?
고마워요, 데이비드
답변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
여기서 얻은 값 (이 시점에서 times 와 f
동일)은 함수의 $1 매개변수와 같습니다.$(factorial $f)
i
마지막으로 인쇄된 값은 다음과 같습니다 f
.
echo $f;
답변2
||
논리적 또는
{}
함수 또는 명령 세트의 시작-끝
for
3개 매개변수: 초기화, 조건, 반복자 변경
{ f=$(( i - 1)); f=$(factorial $f); f=$(( f * i )); echo $f; }
인라인 함수는 숫자를 반환합니다.