내 댓글에 답해줘이 문제SF와 관련하여 OP는 주장합니다.
for i in {1..$NUM}
Bash에서 올바르게 확장하십시오. bash 4.0.33(Ubuntu), 3.2.25(Centos) 및 3.00.16(1)(solaris 10)에 액세스할 수 있습니다. 이들 중 어느 것도 {1..$NUM}을(를) 확장하지 않습니다.
어떤 bash 버전에 확장 기능이 있는지 아는 사람이 있나요? 강타가 아니라면 무엇입니까? zsh가 확장을 수행한다는 것을 알고 있지만 OP 스크립트에서 shebang은 앨리어싱 가능성을 제거해야 합니까?
답변1
서버 장애에 대해 질문한 사람이 틀렸다고 확신합니다. 그들은 의도적으로 일부 세부 사항을 생략했거나 시스템의 이상한 구성을 인식하지 못했습니다(/bin/bash는 다른 것에 대한 링크 역할을 합니다). 나는 2주 전의 bash 4.2 버전, CentOS 5의 bash 3.2, 그리고 최근 bash 2.05a(2001년부터) 빌드를 사용해 보았습니다.
가장 오래된 소스ftp.gnu.org1.14이지만 깔끔하게 빌드되지 않아서 시도해 볼 가치가 있는지 잘 모르겠습니다. 이 버전의 문서에는 최신 문서와 정확히 동일한 핵심 문구가 포함되어 있습니다.
The order of expansions is: brace expansion, tilde expan- sion, parameter, variable, command, and arithmetic substitu- tion (done in a left-to-right fashion), word splitting, and pathname expansion.
하지만 실제로 지금 생각해보면 "{x..y}" 구문은 다음과 같기 때문에 의미가 없습니다.배쉬 3.0에 추가됨, 이전 검색을 쓸모 없게 만듭니다.
그럼 3.0을 시도해 보겠습니다...맞습니다. 같은 행동.
음, 응. 나는 그것을 매우 의심한다. 뭔가 합산되지 않았습니다.
(후에...)
아하! 서버 장애 질문자인정하다"죄송합니다. 내 잘못. {1..10}의 i에 실제 숫자를 넣었으므로 제대로 작동합니다."그럼 바로 그거예요.
정답은이것문제는 "이렇게 작동하는 bash 버전이 없습니다"입니다. :)
답변2
확장하려면 다음을 사용해야 합니다 eval
.
$ echo {1..5}
1 2 3 4 5
$ NUM=5
$ echo {1..$NUM}
{1..5}
$ eval "echo {1..$NUM}"
1 2 3 4 5
하지만 아주 조심하세요 eval
!사용자 입력을 수락하는 경우 해당 작업을 수행하기 전에 실제로 숫자인지 확인하십시오. 내 동료가 말했듯이: " eval
그것은 사악해요!"
답변3
중괄호 확장은 셸 확장의 첫 번째 단계이고 변수는 나중에 확장되므로 중괄호 확장은 변수를 확장하지 않습니다.
Bash 매뉴얼 페이지에서:
Brace 확장은 다른 확장보다 먼저 수행되며, 다른 확장에 고유한 문자는 결과에 보존됩니다. 엄격하게 텍스트입니다. Bash는 확장된 컨텍스트나 중괄호 사이의 텍스트에 구문 해석을 적용하지 않습니다.
그래서:
NUM=4
for i in {1..$NUM}
do
echo $i
done
인쇄
{1..4}