대시에서 다음 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"; } }'