0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ를 사용하여 변수를 생성하는 간단한 방법

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ를 사용하여 변수를 생성하는 간단한 방법

스크립트는 어떤 목적으로 (이 질문의 범위를 넘어서는) bash변수를 사용합니다 .Q

Q=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

이 스크립트는 모든 바이트가 계산되는 환경에서 사용되므로 이는 낭비입니다. 그러나 일부 솔루션은 다음과 같습니다.

Q=0$(seq -s "" 9)$(echo {A..Z}|tr -d " ")

( C로케일의 경우) 더 나쁩니다. 이렇게 간단한 시퀀스를 간결하게 생성하는 명백한 트릭을 보기에는 제가 너무 눈이 먼 걸까요?

답변1

버팀대 확장이 가능한 모든 쉘의 경우:

사용 printf:

$ printf %s {0..9} {A..Z}
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

-->

Q=$(printf %s {0..9} {A..Z})

대신 백틱은 $()바이트를 저장합니다. 특히 Bash에서는 printf -v varprintf를 변수에 쓰는 것이 좋지만 백틱보다 짧지는 않습니다.

printf -vQ %s {0..9} {A..Z}
Q=`printf %s {0..9} {A..Z}`

답변2

내가 아는 가장 간단한 방법은 bash다음 방법을 사용하는 것입니다.

echo {0..9} {A..Z}|sed 's/ //g'

( sed기호 사이의 공백을 제거하는 데 사용됩니다. 괄호 사이의 공백이 중요합니다. 그렇지 않으면 0에서 9까지, A에서 Z까지의 모든 조합이 표시됩니다 0A0B0C0D0E0F0G0H0I0J0K0L0M0N0O0P0Q0R0S0T0U0V0W0X0Y0Z1A1B1C...)

다음과 같이 명령을 단축하는 것이 좋습니다.

echo {0..9} {A..Z}|tr -d ' '

답변3

프레임워크 과제:아니요.

어떤 방식으로든 이미 작성한 것을 작성하는 것보다 리소스 집약적이며 더 효율적인 방법은 이식성이 떨어집니다("쉘 스크립트" 대신 "Bash 스크립트"를 작성해야 함).

일반적으로 언어에 관계없이 가장 좋은 형태의 상수 테이블은 런타임에 프로그래밍 방식으로 생성되는 것이 아니라 리터럴 상수 테이블입니다. 하드코딩이 오류가 발생하기 쉬울 정도로 큰 경우 프로그램을 작성할 때 또는 프로그램의 "빌드 시간" 중에 프로그래밍 방식으로 생성하고 출력을 실제 프로그램에 리터럴 상수로 포함합니다.

답변4

다시,아니요하지만 꼭 이 작업을 수행해야 하는 경우 특별한 셸 기능이 필요하지 않고 일반화되는 패턴은 다음과 같습니다.

printf %b $(printf \\x%.2x $(seq 48 57) $(seq 65 90))

seq이 유틸리티를 사용하지 않으려면 유틸리티를 쉘 함수로 작성할 수 있습니다.

관련 정보