내가 달성하려는 작업에 대한 일종의 의사 코드는 다음과 같습니다.
#!/bin/bash
# I already have the variable below figured out (positive integer):
numlines=$([returns number of lines containing specific characters in a file])
# This is basically what I want to do with it:
for i in {1..$numlines}; do
# the part below is already figured out as well:
do some other stuff
done
"{1..n}" 시퀀스에 실제 숫자를 삽입하면 명령줄에서 제대로 실행할 수 있습니다. 여기에 변수를 포함할 수 있는지와 이를 수행하는 방법을 알고 싶습니다.
- 난 이미
export
시도했어 - 변수 자체를 시퀀스 내 중괄호 안에 넣어 보았습니다.
{1..${numlines}}
- 나는 그것이 확장되기를 바라면서 큰 따옴표로 묶어 보았습니다.
{1.."$numlines"}
- 나는 탈출을 시도했습니다
$
:{1..\$numlines}
set -[something]
이 변수를 확장하려면 명령을 사용해야 합니까 ? 나는 심지어 어떤 형태의 사용법도 시도했지만 eval
... 소용이 없었습니다.
내가 뭔가 간단하거나 모호한 것을 놓치고 있는지, 아니면 시간을 낭비하기 전에 이것이 가능한지 알아야 합니다.
나는 진짜를 하나로 모을 수 있다.진짜필요한 경우 작동하게 하는 방법은 다음과 같습니다. 하지만 가능하면 이를 피하고 올바른 방법을 배우고 싶습니다.
답변1
불행하게도 변수 확장은 중괄호 확장 후에 발생하기 때문에 해당 확장(AFAIK)에서 변수를 사용할 수 없습니다.
다행히도 동일한 작업을 수행하는 도구가 있습니다.
for i in $(seq 1 $numlines); do
# stuff
done
seq
GNU coreutils에서는 POSIX에서 이 작업을 수행하는 방법을 모릅니다.
답변2
틀림없이. 정수 변수를 증가시키는 for 루프를 원하면 다음 형식을 사용하십시오.for
반지정수 변수를 증가시킵니다(또는 보다 일반적으로 루프 변수에 대해 산술 연산을 수행합니다).
for ((i=1; i<=numlines; i++)); do … done
이 구성은 bash(및 ksh93 및 zsh)에서는 작동하지만 일반 sh에서는 작동하지 않습니다. 일반 sh에서는 while 루프와 테스트( [ … ]
) 구조를 사용합니다.
i=1
while [ "$i" -le "$numlines" ]; do
…
i=$((i+1))
done
답변3
seq
Tom Hunter가 지적한 것처럼 이 문제를 해결하는 일반적인 방법인 을 피해야 한다면 eval
절대적으로할 수 있는다음을 수행하십시오(그러나 권장하지는 않습니다).
eval 'for i in {1..'$numlines'}; do echo $i; done'
{} 확장을 피함으로써 POSIX를 유지할 수 있으며 수학적 및 정수 비교만 수행할 수 있습니다 $numlines
.
while [ ! "$numlines" -eq 0 ]; do
echo "$numlines"
: $((numlines-=1))
done
POSIX 외부에는 C 스타일 루프 bash
도 ksh
있습니다 .zsh
for
for((i=0; i<numlines; i++)); do echo $i; done