2012-08-08 2 views
1
  • OS를 기반으로 루프 우분투
  • 파일 이름 = generate_zips.sh 내가 (AN arugment에 따라 수)는 파일의 무리를 만들려고 해요

. 그러나 그것은 작동하지 않습니다. 당신은을 사용하고 -유닉스 쉘 = 인수

LIMIT=$1 

for a in $(seq 1 $LIMIT) 
do 
    mkdir -p zips 
    touch zips/$a 
done 
+0

(i) 이것은 sh가 아닌 bash 구문이므로,'#!/bin/bash' - 당신의'/ bin/sh'가 bash가 아니거나 그것처럼 행동하지 않을 수도 있습니다. (ii) $ a를 문자열로 강제하려면'$ a "를 터치하십시오. (iii) 아마도'mkdir zip; cd zips'를 사용하여 디렉토리의 깊은 트리가 생성되지 않도록하십시오. 하지만 그걸 빼면 ... 몰라. –

+0

'/ bin/sh'는 POSIX 호환 쉘입니다. POSIX 코드로 변경하거나'/ bin/bash'를 사용하여 소위 말하는 "bashisms"를 사용하십시오. – dsh

+0

BTW, 루프 내부에서'mkdir zips && cd zips && $ a'를 터치하면 루프가 올바르게 실패합니다. –

답변

3

당신의 오두막은 잘못 : 잘못 ...

+0

그게 효과가 있습니다!,하지만 차이점은 무엇입니까? –

+0

/bin/sh는 다른 쉘입니다. 실제로 우분투와 데비안에서는 'dash'라고 불리는 쉘입니다.하지만 역사적으로 보면 '쉘 쉘'입니다. 사용 된 for-loop의 스타일은 해당 셸에서 지원되지 않습니다. – rwos

0

시도 뭐죠

#!/bin/sh 
LIMIT=$1 
for ((a=1; a <= LIMIT; a++)) 
do 
    mkdir zips 
    cd zips 
    touch $a 
done 

하지만이

[email protected]:~/repo/filecheck/src/plugins/archive$ ./generate_zips.sh 10 
./generate_zips.sh: 4: ./generate_zips.sh: Syntax error: Bad for loop variable 

를 반환 알아낼 질수 bash 기능 (이중 괄호 안에 "C 스타일"for-loop)이 있지만 /bin/sh을 지정했습니다. 이 값을 /bin/bash으로 변경하십시오.

for 루프를 변경하여 bash의 특별한 기능을 사용하지 않도록 할 수도 있습니다 (다른 답변 참조). 이것은 유닉스 계열 시스템이 모두 /bin/bash 인 것은 아니지만 (거의 모든 시스템이 /bin/sh 임) 다소 이식성이 뛰어납니다. 그러나 bash도 꽤 널리 보급되어 있습니다 (예 : 대부분의 Linux 배포판에서는 표준 쉘입니다).

+0

나는 그것을 시도했다 ... 그 대신에 2를 제외하고 같은 오류가 ... –

+0

그리고, 무슨 말인지 알았어 @rwos : – favoretti

+0

나는 그 같은 ./generate_zips.sh 10 –

0

나는

#!/bin/sh 
mkdir zips 
cd zips 
a=1; while [ $a -le $1 ]; do 
    touch $a 
    a=$(($a + 1)) 
done 

은 약간 짧은하지만이 모든 POSIX 및에서 작동 bash는 특정 방법이 있습니다 ... 그것 같은 것을 할 수 있습니다.

관련 문제