for 루프 구문

for 루프 구문

for i in {1..5}; do x="${i}" echo "$x"; done

출력 없음

1
2
3
4
5

?

이를 수행하는 올바른 방법은 무엇입니까?

(테스트됨for i in {1..5}; do x=$(i) echo "$x"; done

-bash: i: 명령을 찾을 수 없습니다

다른 사람)

답변1

요청한 대로 질문에 답변하세요.

왜 ,,,,를 for i in {1..5}; do x="${i}" echo "$x"; done출력 하지 않습니까 1?​​2345

그 이유는 실행 중에 작업이 평가되는 순서와 관련이 있습니다. 이 명령을 살펴보세요

x="${i}" echo "$x"

이것은 무엇을 위한 것인가?

  1. 변수를 해당 값으로 바꾸기
  2. 변수에 임시 값 할당x
  3. 주문 실행

그래서 당신은 얻습니다

  1. x=1 echo ""(또는 x=2 echo ""등)
  2. 이 명령이 실행되는 동안 x다음 값으로 설정하십시오.1
  3. 주문 실행:echo ""

x이 명령을 값 할당 및 해당 값 인쇄라는 두 가지 명령으로 생각할 수 있습니다 . 그러나 셸 구문에서는 작성한 코드가 완벽하게 적법하므로 셸은 이의 없이 코드를 실행합니다.

답변2

다음 두 가지 질문에 대한 답변을 요청하셨습니다.

  1. 현재 코드가 예상한 출력을 생성하지 않는 이유에 대한 설명을 요청했습니다.

  2. 실제로 예상되는 출력을 생성하도록 코드를 작성하는 올바른 방법에 대해 질문하셨습니다.

귀하의 코드를 보면 왜 이런 식으로 작성했는지에 대한 두 가지 가능한 설명을 볼 수 있습니다.

  1. 약간의 혼란이 있을 수 있습니다for 루프의 구문.

  2. 소위 평가 순서에 약간의 혼란이 있을 수 있습니다.간단한 명령.

for 루프 구문

첫 번째 경우에는 변수 할당 뒤에 세미콜론이 누락되었다고 말하고 싶습니다. for 루프를 한 줄에 작성하려면 루프 본문의 각 명령 뒤에 세미콜론을 입력해야 합니다. 이 시도:

for i in {1..5}; do x="${i}"; echo "$x"; done

또 다른 옵션은 여러 줄 구문을 사용하여 for 루프를 작성하고 세미콜론을 줄 바꿈으로 바꾸는 것입니다.

for i in {1..5}
do
x="${i}"
echo "${x}"
done

세미콜론과 개행 문자를 혼합하여 일치시킬 수도 있습니다. 예를 들면 다음과 같습니다.

for i in {1..5}; do
x="${i}"; echo "${x}"
done

간단한 명령 평가

x="$i"두 번째 경우에는 명령 프롤로그의 변수 할당(예: 할당) 이 명령 본문의 변수 확장(예: ${x}in 의 확장 ) echo "${x}"보다 먼저 발생한다고 가정하고 있을 것입니다 . 그러나 그것은 진실이 아니다. 이를 확인하려면 페이지를 참조하세요.간단한 명령 확장Bash 매뉴얼에서 또는간단한 명령에 대한 섹션내부에POSIX 사양. 두 참조 모두 다음 단락을 포함합니다.

"간단한 명령"은 임의의 순서로 선택적인 변수 할당 및 리디렉션의 시퀀스이며 선택적으로 단어와 리디렉션이 뒤따르고 제어 연산자에 의해 종료됩니다.

주어진 간단한 명령을 실행해야 하는 경우(즉, AND-OR 목록이나사례명령문은 간단한 명령을 우회하지 않습니다.) 명령 텍스트의 처음부터 끝까지 다음 확장, 할당 및 리디렉션을 수행해야 합니다.

  1. 다음 규칙에 따라 변수 할당 또는 리디렉션으로 식별되는 단어쉘 구문 규칙3단계와 4단계의 처리를 위해 저장합니다.

  2. 변수 할당이나 리디렉션이 아닌 단어는 확장되어야 합니다. 확장 후 남은 필드가 있는 경우 첫 번째 필드는 명령 이름으로 처리되어야 하며 나머지 필드는 명령에 대한 인수입니다.

  3. 리디렉션은 다음에 설명된 대로 수행되어야 합니다.리디렉션.

  4. 물결표 확장, 매개변수 확장, 명령 대체, 산술 확장 및 따옴표 제거를 할당하기 전에 모든 변수 할당을 확장해야 합니다.

2단계에서는 명령에서 변수 확장이 발생하지만 1단계에서는 변수 할당이 3단계와 4단계에 저장된다는 점에 유의하세요. 따라서 할당이 발생할 echo "${x}"때까지 표현식이 확장됩니다 . 이는 빈 출력이 나타나는 이유를 설명합니다.echo ""x="${i}"

이 주제에 대한 자세한 내용은 다음 게시물을 참조하세요.

답변3

에서는 Bourne 연산자의 zsh세 번째 ${var::=value}형식을 사용합니다. 여기서 할당은 무조건적입니다(var가 설정되지 않거나 null인 경우에만 해당되지 않음).${var=value}${var:=value}

for i in {1..5}; do echo ${x::=$i}; done

또는:

for i ({1..5}) echo ${x::=$i}

존재하다 bash:

set -o posix # so the value of x remains after eval returns
for i in {1..5}; do x=$i eval 'echo "$x"'; done

즉, $x해당 확장이 포함된 코드를 평가할 때 이를 설정해야 합니다.

여기와 같은 십진 정수 값의 경우 다음을 수행할 수도 있습니다.

for i in {1..5}; do echo "$((x = i))"; done

또는 빈 문자열로 ${var:=value}설정한 x후 언제든지 Bourne 연산자를 사용할 수 있습니다.

for i in {1..5}; do x=; echo "${x:=$i}"; done

관련 정보