Bash 중괄호 확장에 변수를 사용할 수 있나요?

Bash 중괄호 확장에 변수를 사용할 수 있나요?

내가 달성하려는 작업에 대한 일종의 의사 코드는 다음과 같습니다.

#!/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

seqGNU 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

seqTom 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 스타일 루프 bashksh있습니다 .zshfor

for((i=0; i<numlines; i++)); do echo $i; done

관련 정보