2012-10-24 6 views
0

나는 다음과 같은 배쉬 코드를 실행하고 있습니다 :, 배쉬

num=$(ls -1 $ini/*.ini | wc -l) 
echo "Running $num simulations..." 
for i in {1..$num}; 
do 
    echo "a" 
done 

을 그리고 나는 다음과 같은 출력을 얻을 : 그것은 'A'24 선을 인쇄해야

Running 24 simulations... 
a 

을, 그러나 그렇지 않습니다. 무엇을 바꾸어야합니까? 감사!

답변

0

중괄호 확장은 리터럴에서만 작동하며 변수를 확장하지 않습니다.

가능한 해결 방법 :

for i in $(seq 1 $num) ; do 
1

중괄호는 변수를 확장하지 않습니다. 사용할 수 있습니다

for i in $(seq $num); do 
    echo "a" 
done 

man bash :

[...]

순차 식 xy 어느 정수 또는 단일 문자 및 증분, 선택적 증가는 형태 {x..y[..incr]}를 취는 정수이다. 정수가 제공되면 표현식은 xy 사이의 각 숫자로 확장됩니다.

는 [...]

브레이스 확장은 다른 확장 전에 수행되고, 다른 확장에 특수 문자는 모든 결과에 보존된다. 그것은 엄격한 텍스트입니다. Bash는 확장 문자 의 컨텍스트 또는 중괄호 사이의 텍스트에 통어론 해석을 적용하지 않습니다.

[...]

+0

OS X 사용자 참고 사항 : 선택적 증가 기능은 bash 3.2.48과 함께 제공되는 OS X 10.8.2에서는 사용할 수 없습니다. – mklement0

1

시도 :

for ((i=0; i < $num; i++)) 
do 
    echo "a" 
done 
0

읽기 :

seq(1)과 관련된 대답을 무시하십시오. cdarke's answer은 올바른 반복을 보여줍니다.

또한 bash 관련 문제입니다. 중괄호 확장을 사용하는 다른 쉘은 매개 변수 확장을 먼저 평가하지만 절충안이 있습니다.

+0

하지 말아야 할 것,하지 말아야 할 것을 우리에게 말해주십시오. 'seq'를 쓰지 않는 이유는 무엇입니까? 공연? 절충 (편의 대 속도)? – mklement0

+0

@mklement 단어 분할 명령 대체 출력은 좋지 않으며 모든 for x (anything) 패턴에는 문제가 있습니다.iteration을 위해'seq'를 사용하는 것은 무의미합니다. 왜냐하면 빠르고, 짧고, 이식 가능한 내장 된 방법이 있기 때문입니다. 'seq'는 비표준 명령입니다. 이 원리를 이해하지 못하면'$ (ls)'을 사용하는 질문자의 실수가 훨씬 더 심해졌습니다. bash로 태그 된 질문에 대한 거의 모든 대답에 대한 기본 사용법에 대해 동일한 FAQ를 반복해서 말하지 않을 것입니다. 어쩌면 S/O의 다른 곳에서도 그렇게 나쁜 것은 아닙니다. – ormaaj

+0

설명해 주셔서 감사합니다. 'seq'가 비표준임을 알기에 좋다. 네,'((...)) '을 사용하는 것이 빠르며 더 나은 선택이지만, 분명히 아닙니다. OP가'$ (ls ... | wc -l)'을 사용하는 데는 아무런 문제가 없습니다. -single, white-space-free_ 토큰 만 반환하므로 바람직하지 않은 단어 분리의 위험이 없습니다. 결과에서 공백 문자가 나오지 만 별개의 문제입니다). 일반적으로'for x in $ (...)'은 문제가 될 수 있지만 확실히 사용됩니다 : 올바른 라인 단위 처리를 위해 필요한 것은'$ IFS'를'$ '\ n'으로 설정하는 것입니다. '(임시적으로). – mklement0