아래는 내가 달성하려는 것에 대한 일종의 의사 코드입니다.
#!/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
… all을 사용하는 몇 가지 형태를 사용해 보았습니다 .
내가 놓친 것이 단순하거나 모호한 것이 있는지 또는 더 이상 시간을 낭비하기 전에 이것이 가능한지 알아야합니다.
필요에 따라 작동하도록 실제로 해킹하는 방법을 함께 던질 수는 있지만 가능한 한 피하고 가능한 한 올바른 방법을 배우고 싶습니다.
답변
불행하게도 변수 확장은 중괄호 확장 후에 발생하므로 해당 확장 (AFAIK)에서 변수를 사용할 수있는 방법이 없습니다.
다행히도 동일한 작업을 수행하는 도구가 있습니다.
for i in $(seq 1 $numlines); do
# stuff
done
seq
GNU coreutils에서 온 것입니다. POSIX에서 어떻게하는지 모릅니다.
답변
확실한. 정수 변수를 증가시키는 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
답변
당신이하지 않도록해야합니다 seq
톰 헌트가 지적 하듯이에 대한 일반적인 솔루션을 것으로 보인다, 다음 eval
확실히 할 수 그것을 (하지만, 나는 그것을 권장하지 것이다) 수행
eval 'for i in {1..'$numlines'}; do echo $i; done'
{} 확장을 피함으로써 POSIX를 유지할 수 있으며 간단히 수학과 정수를 비교할 수 있습니다 $numlines
.
while [ ! "$numlines" -eq 0 ]; do
echo "$numlines"
: $((numlines-=1))
done
POSIX의 외부, bash
그리고 ksh
하고 zsh
또한 C-스타일이 for
루프 :
for((i=0; i<numlines; i++)); do echo $i; done