대시의 범위는 어떻게 작동하나요?

대시의 범위는 어떻게 작동하나요?

대시에서 다음 bash 스크립트를 빠르게 실행하는 방법을 찾으려고 노력 중입니다.

for x in {1..5}
do
    for y in {a..c}
    do
    echo $HOME$x$y
    done
done

Dash는 중괄호 확장을 지원하지 않으며 위의 스크립트를 모방하는 범위와 유사한 구성을 얻는 다른 방법을 알지 못합니다. while 루프로 해결할 수 있을 것 같지만 스크립트 적응이 아니라 완전히 다른 짐승이라고 생각합니다.

Dash에서 위 스크립트의 정신을 유지하는 것이 가능합니까? seq와 같은 외부 프로그램을 사용하지 않고도 위 스크립트의 정신을 유지할 수 있습니까? 어떻게?

답변1

대괄호 확장 자체는 POSIX에서 정의되지 않으며 다른 POSIX 호환 도구의 옵션을 사용하여 변환해야 합니다. 그러한 접근 방식 중 하나는 ASCII 테이블을 사용하여 문자의 ASCII 값을 해당 문자 값으로 변환하는 것입니다 printf(). 가치 매핑을 찾아보세요 man ascii.

i=1
asciiStart=97
asciiEnd=99
while [ "$i" -le 5 ]
do
    while [ "$asciiStart" -le "$asciiEnd" ]
    do
        echo "$HOME$i$(printf "\\$(printf '%03o' "$asciiStart")")"
        asciiStart=$((asciiStart + 1))
    done
    asciiStart=97
    i=$(( i + 1 )) 
done

답변2

아마도 그렇지 않을 것입니다. 왜냐하면 중괄호 확장이 수행하는 작업을 수행하는 다른 함수가 있다면 중괄호 확장이 필요하지 않기 때문입니다...

목록이 정적이 아닌 경우(예: 상한이 다름) Bash에서 중괄호 확장을 쉽게 사용할 수 없습니다. {1..$n}원하는 대로 수행되지 않기 때문입니다(중괄호 확장).앞으로변하기 쉬운).

반면에, 귀하의 목록이정적이라면 다른 프로그램을 사용하여 목록을 생성하고 이를 스크립트에 직접 삽입하는 것이 어렵지 않으므로 결과는 다음과 같습니다.

for x in 1 2 3 4 5; do
    for y in a b c; do
        echo "$HOME$x$y"
    done
done

쉘에서 문자 목록을 생성하기 위해 a를 사용하는 것도 while약간 어려운 것 같습니다 .

죄송합니다. 하지만 다른 언어에서는 이 작업을 수행하는 것이 더 쉬운 것 같습니다. 펄처럼:

highnum=5 highchar=c perl -le 'for $x (1..$ENV{highnum}) { 
                                  for $y ("a"..$ENV{highchar}) { 
                                     print "$ENV{HOME}/$x$y"; } }'

관련 정보