왜
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
?2
3
4
5
그 이유는 실행 중에 작업이 평가되는 순서와 관련이 있습니다. 이 명령을 살펴보세요
x="${i}" echo "$x"
이것은 무엇을 위한 것인가?
- 변수를 해당 값으로 바꾸기
- 변수에 임시 값 할당
x
- 주문 실행
그래서 당신은 얻습니다
x=1 echo ""
(또는x=2 echo ""
등)- 이 명령이 실행되는 동안
x
다음 값으로 설정하십시오.1
- 주문 실행:
echo ""
x
이 명령을 값 할당 및 해당 값 인쇄라는 두 가지 명령으로 생각할 수 있습니다 . 그러나 셸 구문에서는 작성한 코드가 완벽하게 적법하므로 셸은 이의 없이 코드를 실행합니다.
답변2
다음 두 가지 질문에 대한 답변을 요청하셨습니다.
현재 코드가 예상한 출력을 생성하지 않는 이유에 대한 설명을 요청했습니다.
실제로 예상되는 출력을 생성하도록 코드를 작성하는 올바른 방법에 대해 질문하셨습니다.
귀하의 코드를 보면 왜 이런 식으로 작성했는지에 대한 두 가지 가능한 설명을 볼 수 있습니다.
약간의 혼란이 있을 수 있습니다for 루프의 구문.
소위 평가 순서에 약간의 혼란이 있을 수 있습니다.간단한 명령.
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 목록이나사례명령문은 간단한 명령을 우회하지 않습니다.) 명령 텍스트의 처음부터 끝까지 다음 확장, 할당 및 리디렉션을 수행해야 합니다.
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