HP OpenVMS Systems Documentation

Content starts here

12 기호, 명령 및 표현식 정의
기호는 숫자, 문자 또는 논리 값(true 또는 false 등)을 나타내는 이름입니다. DCL 명령행에 기호를 사용하면 DCL은 명령을 실행하기 전에 그 기호를 해당 값으로 대체합니다.
매개 변수, 여러 한정자 및 값을 포함하는 DCL 명령행을 입력하려면 많은 수고와 시간이 필요할 수 있습니다. DCL과의 상호 작용을 단순하게 하여 시간을 절약하려면 자주 입력하는 명령 대신 사용할 기호를 설정할 수 있습니다.
또한, 명령 프로시저에서 기호를 사용하여 특정 유형의 데이터를 수집, 저장 및 조작할 수도 있습니다. 명령 프로시저에 대한 자세한 내용은 13장 및 14장을 참조하십시오.
이 장에서는 다음을 설명합니다.
기호 사용
기호 표시
다른 기호로 기호 사용
기호를 사용한 데이터 저장 및 조작
문자열
숫자 값 및 식 사용
논리 값 및 식 사용
표현식의 값 유형 변환
기호표 이해
기호 값 마스크
기호 대체 이해
명령 처리의 3 단계
기호 사용에 대한 대안: 자동 외부 명령
추가 정보는 다음을 참조하십시오.
기호 및 그 사용에 관한 자세한 내용은 OpenVMS DCL Dictionary를 참조하십시오.
새 명령 정의에 대한 자세한 내용은 OpenVMS Command Definition, and Message Utilities를 참조하십시오.
기호
기호를 다음과 같이 사용할 수 있습니다.
명령, 매개 변수 또는 명령행의 동의어로 사용.
긴 명령행을 입력하지 않고 대신 사용할 기호를 만들 수 있습니다.
기호 이름만 입력하여 이미지를 실행할 수 있는 외부 명령을 정의.
이 명령은 DCL이 인식하지 않으므로 “외부”입니다.
명령 프로시저 파일에서 조건 실행과 변수 대체 등의 프로그램 작업을 실행.
표현식의 변수로 기호를 사용하거나 명령 프로시저로 매개 변수를 보내고 받기 위해 기호를 사용할 수 있습니다. 또한, READ, WRITE 및 INQUIRE와 같은 DCL 명령에서는 데이터 레코드를 참조하기 위해 기호를 사용합니다.
다음 보기에서는 자주 액세스하는 디렉토리를 기본값으로 설정하는 기호를 만듭니다. 이 명령은 기호 WORK를 정의 및 사용하여 기본값을 WORK1:[JONES.WORK] 디렉토리로 설정하는 방법을 보여 줍니다
$ WORK :== SET DEFAULT DISK1:[JONES.WORK]
$ WORK
$ SHOW DEFAULT
DISK1:[JONES.WORK]
논리 이름 및 기호 비교
논리 이름과 기호는 비슷한 것 같지만 다르게 사용됩니다. 다음 표에서 논리 이름과 기호의 기능, 용도 및 기타 특성을 비교합니다.
표 12-1
특성
논리 이름
기호
기능
장치, 파일, 대기열 및 다른 시스템 객체 사양을 나타냅니다.
명령 또는 명령 문자열의 일부를 나타냅니다.
용도
전체 장치, 디렉토리, 파일, 대기열 또는 다른 시스템 객체 사양 대신 사용됩니다. 논리 이름은 변환을 위해 파일 시스템에 전달될 명령 문자열 매개 변수의 일부로 사용해야 합니다.
명령 문자열 대신 사용됩니다. 기호는 명령 언어 인터프리터에서 변환할 명령 문자열의 첫 단어로 사용해야 합니다.
저장
사용자의 프로세스, 작업, 그룹 또는 시스템 논리 이름 표에 저장됩니다. 논리 이름 표 만들기를 참조하십시오.
글로벌 또는 로컬 기호 표에 저장됩니다. 기호 표 이해를 참조하십시오.
만들기
ASSIGN이나 DEFINE 명령을 사용하여 논리 이름을 만듭니다. 논리 이름 삭제를 참조하십시오.
할당문(= or ==)을 사용하여 기호를 만듭니다. 기호 사용을 참조하십시오.
표시
SHOW LOGICAL 또는 SHOW TRANSLATION 명령을 사용하여 논리 이름을 표시합니다. 논리 이름 표시를 참조하십시오.
SHOW SYMBOL 명령을 사용하여 기호를 표시합니다. 기호 표시를 참조하십시오.
삭제
DEASSIGN 명령을 사용하여 논리 이름을 삭제합니다. 논리 이름 삭제를 참조하십시오.
DELETE/SYMBOL 명령을 사용하여 기호를 삭제합니다. 기호 삭제를 참조하십시오.

기호 사용
로컬 및 글로벌의 두 가지 유형의 기호를 만들 수 있습니다. 로컬 기호는 현재 명령 수준과 현재 명령 수준에서 실행된 명령 프로시저에서 액세스할 수 있습니다. 글로벌 기호는 모든 명령 수준에서 액세스할 수 있습니다.
기호는 문자열, 숫자, 렉시칼 함수, 논리 값 또는 다른 기호로 정의할 수 있습니다. 기호 이름은 1~255자가 될 수 있고 문자, 밑줄(_) 또는 달러 기호($)로 시작해야 합니다. 기호 이름에서 대소문자는 모두 대문자로 처리됩니다.
기호를 만들려면 할당문(= or ==)이나 문자열 할당(:= or :==)을 사용합니다. 문자열 할당을 사용할 경우 모든 영문자는 대문자로 변환되고 여러 공백과 탭은 단일 공백으로 압축됩니다. 문자열 할당을 사용하여 DCL 명령을 나타내는 기호를 만들거나 외부 명령을 정의할 수 있습니다. 두 경우 모두 255자를 초과할 수 없습니다. 문자열 할당에서 두 줄을 넘어 문자열을 계속하려면 한 개의 하이픈을 사용합니다.
READ 및 INQUIRE 명령을 사용하여 기호를 만들 수도 있습니다(13장 및 14장 참조).
로컬 기호 만들기
다음 보기에서는 로컬 기호 SS를 DCL 명령 SHOW SYMBOL에 할당합니다.
$ SS = "SHOW SYMBOL"
다음 보기에서는 로컬 기호 DB를 DCL 명령 DIRECTORY ACCOUNTS:[BOLIVAR]:에 할당합니다.
$ DB := DIRECTORY ACCOUNTS:[BOLIVAR]
글로벌 기호 만들기
다음 보기에서는 글로벌 기호 DC를 사용하여 DCL 명령행을 나타냅니다. 이 기호 이름을 입력하면 지정된 한정자와 함께 DCL 명령 DIRECTORY가 실행됩니다.
$ DC == "DIRECTORY/SIZE=ALL DISK1:[JONES.TAX]MONEY.LIS"
다음 보기에서는 글로벌 기호 READY를 사용하여 DCL 명령행을 나타냅니다. 이 기호 이름을 입력하면 지정된 한정자와 함께 DCL 명령 PRINT가 실행됩니다.
$ READY :== PRINT/CONFIRM/QUEUE=AKI$LN03/NOTIFY/RESTART
$ READY FILE.DAT
기호를 사용한 DCL 명령 표시
로그인 명령 파일(LOGIN.COM)에서나 DCL 수준에서 대화형으로 DCL 명령을 나타내는 기호를 정의할 수 있습니다. 로그인 명령 파일에 기호를 정의할 경우 로그인할 때마다 기호를 사용할 수 있지만 대화형으로 기호를 정의할 경우에는 현재 프로세스 동안에만 기호를 사용할 수 있습니다.
DCL 명령과 같은 이름으로 기호를 정의하면 정의한 기호가 DCL 명령 이름보다 우선합니다. 예를 들어, 기호 HELP를 명령 TYPE HELP.LST로 정의하면 더 이상 HELP를 입력하여 시스템의 도움말 유틸리티를 호출할 수 없습니다.
기호 약어
간략화할 수 있는 기호를 만들려면 별표(*)를 사용합니다. 일반적으로 기호를 사용할 수 있는 모든 상황에서 간략화한 기호 정의를 사용할 수 있습니다. 부분 문자열 대체를 포함하는 기호는 예외입니다. 자세한 내용은 부분 문자열 대체를 참조하십시오.
기존 기호는 대체될 수 있습니다. 기존 기호가 별표나 별표 다음의 새 기호와 정확히 일치하면 새 기호가 기존 기호를 대체합니다. 또한, 이름이 별표나 별표 다음의 기존 기호와 부분적으로 일치하는 다른 기호를 정의할 수 없습니다.
다음 보기에서는 PR, PRI 또는 PRIN으로 간략화할 수 있는 로컬 기호 PRINT를 만듭니다.
$ PR*INT = "PRINT/CONFIRM/QUEUE=AKI$LN03/NOTIFY/RESTART"
지정된 한정자와 함께 DCL 명령 PRINT를 실행하려면 기호나 그 약어를 입력할 수 있습니다.
외부 명령 정의
비 DCL 이미지의 파일 지정 방법을 기호와 일치시키면 기호 이름을 입력하여 그 이미지를 실행할 수 있습니다. 이미지를 실행하는 기호를 외부 명령이라고 합니다. 외부 명령은 명령 인터프리터가 DCL 명령으로 인식하지 않는 이미지입니다. DCL 명령의 각 요소와 마찬가지로 외부 명령도 255자를 초과할 수 없습니다.
기호를 외부 명령으로 정의하는 형식은 다음과 같습니다.
symbol-name :=[=] $image-file-spec
symbol-name =[=] "$image-file-spec"

기호 정의 시작 부분에서 달러 기호($)가 파일 지정 방법 앞에 오고 그 사이에 공백이 없으면 이미지 실행 요청을 의미합니다.
이미지 파일 지정 방법의 경우 기본 장치 및 디렉토리 이름은 SYS$SYSTEM이고 기본 파일 형식은 .EXE이며 기본 파일 버전 번호는 최상위 버전입니다.
외부 명령을 사용하는 대신 Command Definition 유틸리티를 사용하여 새 명령을 정의할 수도 있습니다. 자세한 내용은 OpenVMS Command Definition, Librarian, and Message Utilities Manual을 참조하십시오.
기호를 지정하지 않고 외부 명령을 자동으로 실행하는 방법도 있습니다. 자세한 내용은 기호 사용에 대한 대안: 자동 외부 명령을 참조하십시오.
다음 보기에서는 이미지 DISK1:[ACCOUNTS]PRINTALL.EXE를 실행하도록 글로벌 기호 PRINTALL을 정의합니다.
$ PRINTALL :== $[ACCOUNTS]PRINTALL
명령행에서 PRINTALL 다음에 매개 변수를 입력할 수 있습니다.
다음 보기에서 파일 지정 방법 RAT.DAT는 PRINTALL에서 정의한 이미지에 전달되는 매개 변수입니다.
$ PRINTALL RAT.DAT
기호 대체
명령 인터프리터는 어포스트로피(')로 묶인 기호를 찾아 변환합니다. 따라서 어포스트로피 다음에 기호나 렉시칼 함수를 사용하여 매개 변수를 지정하면 기호 대체가 일어납니다(기호 대체 이해 참조). 또는 명령 인터프리터에서 해당 줄을 구문 분석하지 않습니다. 이미지에서는 매개 변수가 필요하고 구문 분석이나 명령행 평가를 수행해야 합니다.
기호 삭제
DELETE/SYMBOL 명령은 기호를 삭제합니다. 글로벌 기호를 삭제하려면 /GLOBAL 한정자를 포함시킵니다. 예를 들어, 글로벌 기호 TEMP를 삭제하려면 다음 명령을 입력합니다.
$ DELETE/SYMBOL/GLOBAL TEMP
기호 표시
SHOW SYMBOL 명령은 기호 값을 표시합니다. 특정 기호 값을 표시하려면 SHOW SYMBOL 명령 다음에 해당 기호의 이름을 입력합니다. 특정 글로벌 기호의 값을 표시하려면 /GLOBAL 한정자를 포함시킵니다. SHOW SYMBOL/ALL 명령은 모든 로컬 기호를 표시하고 명령 SHOW SYMBOL/ALL/GLOBAL은 모든 글로벌 기호를 표시합니다.
기호에 정수 값이 있는 경우 SHOW SYMBOL 명령은 값을 10진, 16진 및 8진 표기법으로 표시합니다.
다음 보기에서는 기호 PR을 표시합니다.
$ SHOW SYMBOL PR
PR*INT = "PRINT/CONFIRM/COPIES=2/QUEUE=DOC$LN03/NOTIFY/RESTART"
다음 보기에서는 기호 TOTAL의 정수 값이 표시됩니다.
$ SHOW SYMBOL TOTAL
TOTAL = 4 Hex = 00000004 Octal = 00000000004
다른 기호로 기호 사용
정의한 기호를 다른 기호 정의의 일부로 사용할 수 있습니다. DCL에서는 기호를 사용하는 상황에 따라 해당 기호를 문자열이나 숫자로 변환합니다.
다음 보기에서는 정수 값 3을 기호 COUNT에 할당합니다.
$ COUNT = 3
그런 다음 COUNT 값을 다른 할당문에서 사용할 수 있습니다. 예를 들어, 다음에서는 COUNT 값에 1을 더합니다.
$ TOTAL = COUNT + 1
결과(4)는 기호 TOTAL과 일치시킵니다.
기호 연결
더하기 기호(+)로 여러 기호를 연결하여 긴 문자열을 만들 수 있습니다. 또한, 어포스트로피(')로 각 기호 이름을 묶어 둘 이상의 기호를 연결할 수도 있습니다.
기호 대체 요청에 대한 자세한 내용은 기호 대체 연산자를
참조하십시오.
다음 보기에서는 기호 “Saturday”와 “Sunday”를 사용하여 기호 “WEEKEND”를 만듭니다.
$ DAY1 = "Saturday, "
$ DAY2 = "Sunday"
$ WEEKEND = DAY1 + DAY2
$ SHOW SYMBOL WEEKEND
WEEKEND = "Saturday, Sunday"
다음 보기에서는 어포스토로피를 사용하여 기호 NAME과 TYPE를 연결합니다.
$ NAME = "MYFILE"
$ TYPE = ".DAT"
$ PRINT 'NAME''TYPE'
이 PRINT 명령은 MYFILE.DAT의 복사본을 인쇄합니다.
문자열 할당에 기호 포함
문자열 할당에 로컬 기호를 포함시키려면 콜론과 등호(:=)를 사용하고 문자열 할당에 글로벌 기호를 포함시키려면 콜론과 두 개의 등호(:==)를 사용합니다. 두 유형(로컬 또는 글로벌)의 기호 모두에서 기호는 어포스토로피(' ')로 묶습니다. 그렇지 않으면 DCL에서 이것을 기호로 인식하지 않습니다.
기호에 null 문자열을 정의하면 그 기호의 값은 0이 됩니다.
다음 보기에서는 기호 COUNT가 문자열 할당문에 포함됩니다.
$ BARK := P'COUNT'
앞의 보기에서는 COUNT에 정수 값 3이 할당되었고 이 보기에서는 COUNT가 문자열로 변환되어 문자 P에 추가됩니다. 따라서 기호 BARK의 값은 P3가 됩니다.
다음 보기에서 기호 A는 null입니다.
$ A = ""
$ B = 2
$ C = A + B
$ SHOW SYMBOL C
C = 2 Hex = 00000002 Octal = 00000000002
기호를 사용한 데이터 저장 및 조작
명령 프로시저에서 기호를 변수로 사용할 수 있습니다. 변수는 계산하거나 문자가 아닌 값으로 할당하는 값을 포함할 수 있습니다. 예를 들어, 렉시칼 함수 값을 변수에 할당하거나 파일 레코드의 값을 변수로 읽어 올 수 있습니다.
표현식은 값들의 조합입니다. 명령 프로시저의 경우 표현식은 기호 할당문(등호의 오른쪽), IF 문, WRITE 명령에서 사용되고 렉시칼 함수의 인수로 사용됩니다.
기호를 정의할 때 할당문의 왼쪽에서는 기호 이름을 정의하고 할당문의 오른쪽에는 표현식이 포함됩니다. 표현식의 각 값(피연산자라고도 함)은 연산자로 다른 값과 연결할 수 있습니다. DCL은 표현식을 계산하고 그 결과를 기호에 할당합니다. 표현식이 문자열로 계산되면 기호는 문자열 값이 됩니다.
다음의 보기에서 로컬 기호 BARK는 세 수를 더하는 표현식이 됩니다.
$ BARK = 1 + 2 + 3
피연산자는 1과 2와 3이고 연산자는 더하기 기호(+)입니다. 계산된 식이 정수이므로 기호도 정수 값이 됩니다.
문자열
문자열은 인쇄할 수 있는 문자를 포함할 수 있습니다. 부록 A에는 ASCII 문자 집합과 DEC 다국적 문자 집합에 대한 표가 있습니다. 이 표에는 문자열에 포함시킬 수 있는 문자가 나열되어 있습니다.
문자는 다음과 같은 세 가지 기본 범주로 나뉩니다.
영숫자 문자
대문자 A-Z, 소문자 a-z, 숫자 1-9, 달러 기호($), 밑줄(_) 및 하이픈(-)
특수 문자
표시 또는 인쇄할 수 있는 다른 모든 문자: 감탄 부호(!), 인용 부호( ”), 번호 기호(#) 등
인쇄할 수 없는 문자
인쇄 또는 표시할 수 없는 모든 문자.
일반적으로 인쇄할 수 없는 문자는 표시 및 인쇄 용도에는 필요하지 않습니다.
그러나 일부 인쇄할 수 없는 문자는 다음과 같은 제어 기능으로 사용됩니다.
표 12-2
문자
기능
HT
다음 가로 탭에서 인쇄 또는 입력을 시작합니다.
LF
다음 줄에서 인쇄 또는 입력을 시작합니다.
FF
다음 페이지의 맨 위에서 인쇄 또는 입력을 시작합니다.
CR
같은 줄의 첫 공백에서 인쇄 또는 입력을 시작합니다.
ESC
터미널 이스케이프 시퀀스를 시작합니다.
SP
공백 하나를 삽입합니다.

문자열 정의
인용 부호(“ ”)로 묶어서 문자열을 정의할 수 있습니다. 따라서 대소문자와 공백은 기호 할당이 이루어진 뒤에도 보존됩니다. 다음을 참조하십시오.
문자열 안에 인용 부호( ”)를 포함시키려면 두 개의 연속된 인용 부호를 입력합니다.
문자열을 두 줄 이상 계속하려면 더하기 기호(문자열 연결) 및 하이픈(연결)을 사용합니다.
인용 문자열 안에서는 하이픈 연결 문자를 사용할 수 없습니다.
다음 보기에서 문자열 “YES”는 인용된 것이므로 인용 부호 내에 정의해야 합니다.
$ PROMPT = "Type ""YES"" or ""NO"""
$ SHOW SYMBOL PROMPT
PROMPT = "Type "YES" or "NO""
다음 보기에서는 문자열이 두 줄에 계속됩니다.
$ HEAD = "MONTHLY REPORT FOR" + -
_$ " DECEMBER 1999"
$ SHOW SYMBOL HEAD
HEAD = "MONTHLY REPORT FOR DECEMBER 1999"
문자열 표현식
문자열 표현식은 문자열과 문자열로 평가되는 렉시칼 함수 또는 문자열 값을 가지는 기호를 포함할 수 있습니다. 표현식에 문자열을 사용하려면 문자열을 인용 부호(“ ”)로 묶어야 합니다. 인용 부호를 사용하지 않으면 DCL에서는 문자열을 기호로 처리합니다.
문자열 표현식은 문자열 피연산자라는 다음과 같은 값을 결합합니다.
인용 부호에 표시해야 하는 문자열
문자열을 나타내는 기호
문자열로 평가되는 렉시칼 함수
문자열과 숫자 간의 연산이나 비교를 수행할 경우 DCL은 문자열을 숫자로 변환합니다.
다음의 하위 절에서 설명하는 바와 같이 문자열 피연산자는 추가(문자열 연결), 제거(문자열 빼기), 비교 또는 다른 문자열로 대체할 수 있습니다.
다음 보기에서 문자열 “CAT”은 인용 부호 안에 표시해야 합니다.
$ TEMP = "CAT"
다음 보기에서 기호 TEMP는 문자열 “CAT”을 나타냅니다. 기호 TOPIC은 문자열 “THE”와 기호 TEMP가 나타내는 문자열(“CAT”)의 연결이므로 “THE CAT”입니다.
$ TOPIC = "THE" + TEMP
다음 보기에서 기호 COUNT는 렉시칼 함수 F$STRING(65)을 나타냅니다.
$ COUNT = F$STRING(65)
문자열 연산
다음과 같은 문자열 연산을 지정할 수 있습니다.
연결 - 더하기 기호는 두 문자열을 연결합니다.
빼기 - 빼기 기호는 첫 번째 문자열에서 두 번째 문자열을 제거합니다.
첫 번째 문자열에서 두 번째 문자열이 두 번 이상 나타나면 처음 나타나는 문자열만 제거됩니다.
다음 보기에서는 더하기 기호(+)를 사용하여 두 문자열을 연결합니다.
$ COLOR = "light brown"
$ WEIGHT = "30 lbs."
$ DOG2 = "No tag, " + COLOR + ", "+ WEIGHT
$ SHOW SYMBOL DOG2
DOG2 = "No tag, light brown, 30 lbs."
다음 보기에서는 빼기 기호(-)를 사용하여 문자열을 제거합니다.
$ SHOW SYMBOL DOG2
DOG2 = "No tag, light brown, 30 lbs."
$ DOG2 = DOG2 - ", 30 lbs."
$ SHOW SYMBOL DOG2
DOG2 = "No tag, light brown"
문자열 비교
두 문자열을 비교할 경우 문자 대문자로 문자열을 비교합니다. 길이가 다른 문자열은 동일하지 않습니다. 예를 들어, “dogs”는 “dog”보다 큽니다.
비교 기준은 문자의 ASCII 값입니다. 이런 기준에 따라 숫자 0-9는 대문자 A-Z보다 작고 대문자 A-Z는 소문자 a-z보다 작습니다. 문자열 비교는 다음 조건 중 하나가 참이면 종료됩니다.
모든 문자열을 비교하며 이 경우 문자열은 동일합니다.
첫 번째 불일치가 발생합니다.
표 12-3에서는 여러 문자열 비교 유형을 나열합니다.
표 12-3 문자열 비교
비교
연산자
설명
같음
.EQS.
한 문자열과 다른 문자열이 같은지 비교합니다.
크거나 같음
.GES.
한 문자열과 다른 문자열을 비교하여 지정한 첫 번째 문자열에 크거나 같은 값이 있는지 확인합니다.
큼
.GTS.
한 문자열과 다른 문자열을 비교하여 지정한 첫 번째 문자열에 큰 값이 있는지 확인합니다.
작거나 같음
.LES.
한 문자열과 다른 문자열을 비교하여 지정한 첫 번째 문자열에 작거나 같은 값이 있는지 확인합니다.
작음
.LTS.
한 문자열과 다른 문자열을 비교하여 지정한 첫 번째 문자열에 작은 값이 있는지 확인합니다.
같지 않음
.NES.
한 문자열과 다른 문자열이 같지 않은지 비교합니다.

다음의 모든 보기에서 기호 LAST_NAME의 값은 “WHITEFIELD”입니다
다음 보기에서 기호 TEST_NAME은 0(거짓)으로 평가됩니다.
기호 LAST_NAME 값은 문자열 'HILL'과 같지 않습니다.
$ TEST_NAME = LAST_NAME .EQS. "Hill"
$ SHOW SYMBOL TEST_NAME
TEST_NAME = 0 ...
다음 보기에서는 기호 TEST_NAME이 1(참)로 평가됩니다.
기호 LAST_NAME 값은 문자열 HILL”보다 크거나 같습니다.
$ TEST_NAME = LAST_NAME .GES. "HILL"
$ SHOW SYMBOL TEST_NAME
TEST_NAME = 1 ...
다음 보기에서는 기호 TEST_NAME이 1(참)로 평가됩니다.
기호 LAST_NAME 값은 문자열 “HILL”보다 큽니다.
$ TEST_NAME = LAST_NAME .GTS. "HILL"
$ SHOW SYMBOL TEST_NAME
TEST_NAME = 1 ...
다음 보기에서는 기호 TEST_NAME이 0(거짓)으로 평가됩니다.
기호 LAST_NAME은 문자열 “HILL”보다 작거나 같지 않습니다.
$ TEST_NAME = LAST_NAME .LES. "HILL"
$ SHOW SYMBOL TEST_NAME
TEST_NAME = 0 ...
다음 보기에서는 기호 TEST_NAME이 0(거짓)으로 평가됩니다.
기호 LAST_NAME 값은 문자열 “HILL”보다 작지 않습니다.
$ TEST_NAME = LAST_NAME .LTS. "HILL"
$ SHOW SYMBOL TEST_NAME
TEST_NAME = 0 ...
다음 보기에서는 기호 TEST_NAME이 1(참)로 평가됩니다.
기호 LAST_NAME 값은 문자열 “HILL”과 같지 않습니다.
$ TEST_NAME = LAST_NAME .NES. "HILL'
$ SHOW SYMBOL TEST_NAME
TEST_NAME = 1 ...
부분 문자열 대체
대체 문자열의 위치와 크기를 지정하여 문자열의 일부를 다른 문자열로 대체할 수 있습니다. 로컬 기호의 경우 형식은 다음과 같습니다.
symbol-name[offset,size] := replacement-string
글로벌 기호의 형식은 다음과 같습니다.
symbol-name[offset,size] :== replacement-string
요소는 다음과 같습니다.
표 12-4
offset
원래 문자열의 첫 문자를 기준으로 대체 문자열의 위치를 나타내는 정수. offset 0은 기호의 첫 번째 문자, offset 1은 두 번째 문자를 의미합니다.
size
대체 문자열의 길이를 나타내는 정수.

부분 문자열을 교체하려면 다음 규칙을 따릅니다.
대괄호를 꼭 사용해야 합니다. 여는 대괄호와 기호 이름 사이에 공백이 있어서는 안 됩니다.
size 및 offset 값의 범위는 0-768입니다.
대체 문자열은 문자열이어야 합니다.
지정하는 기호 이름이 처음에 정의되지 않은 이름일 수 있습니다. 할당문에서 기호 이름을 만들고 필요한 경우 기호 값의 앞이나 뒤에 공백을 넣습니다.
offset과 size를 지정하여 빈 줄을 나타내는 기호를 만들 수 있습니다.
열의 레코드를 정렬하면 목록을 읽고 정렬하기가 쉬워집니다. 이 형식을 사용하여 데이터 정렬 방법을 지정할 수 있습니다.
다음 보기에서 첫 번째 할당문은 기호 A에 값 PACKRAT을 부여합니다. 두 번째 할당문에서는 MUSK로 A 값의 첫 네 문자를 교체합니다. 따라서 A 값은 MUSKRAT가 됩니다.
$ A := PACKRAT
$ A[0,4] := MUSK
$ SHOW SYMBOL A
A = "MUSKRAT"
다음 보기에서 기호 B는 이전 값이 아니므로 앞에 4개의 공백이 오고 그 뒤에 RAT가 오는 값이 됩니다.
$ B[4,3] := RAT
다음 보기에서는 80개의 빈 공백이 기호 LINE에 할당됩니다.
$ LINE[0,80]:= " "
다음 보기에서 첫 번째 문은 DATA의 첫 15개 열을 값 NAME으로 채웁니다. 두 번째 문은 18열을 GRADE의 값으로 채웁니다. 16열과 17열은 공백을 포함합니다.
$ DATA[0,15] := "NAME"
$ DATA[17,1] := "GRADE"
숫자 값 및 식 사용
숫자는 다음 값이 될 수 있습니다.
10진수 - ASCII 문자 0-9
16진수 - ASCII 문자 0-9 및 A-F
8진수 - ASCII 문자 0-7
기호에 할당하는 수의 범위는 -2147483648 ~ 2147483647(십진수)이어야 합니다. 이 범위를 벗어나는 숫자를 지정하면 오류가 발생하거나 계산되더라도 잘못된 값을 냅니다.
숫자 지정
DCL 명령 수준이나 명령 프로시저에서 다음과 같이 숫자를 지정합니다.
양수
적절한 자릿수를 입력하여 양수를 지정합니다.
음수
음수 앞에는 빼기 기호(-)를 붙입니다.
기수
숫자 앞에(빼기 기호가 아님) 16진수인 경우 %X, 8진수인 경우 %0를 붙여 10진수가 아닌 기수로 숫자를 지정합니다.
분수
숫자에는 소숫점이 포함될 수 없습니다. 계산에서 분수는 버립니다.
예를 들어, 8/3은 2와 같습니다.
다음 보기에서는 숫자 13을 기호 DOG_COUNT에 할당합니다.
$ DOG_COUNT = 13
$ SHOW SYMBOL DOG_COUNT
DOG_COUNT = 13 Hex = 0000000D Octal = 00000000015
다음 보기에서는 음수(-15237)를 빼기 기호(-)로 표시합니다.
$ BALANCE = -15237
$ SHOW SYMBOL BALANCE
BALANCE = -15237 Hex = FFFFC47B Octal = 37777742173
다음 보기에서는 16진수 D를 접두사 %X로 표시합니다.
$ DOG_COUNT = %XD
$ SHOW SYMBOL
DOG_COUNT DOG_COUNT = 13 Hex = 0000000D Octal = 00000000015
$ BALANCE = -%X3B85
$ SHOW SYMBOL BALANCE
BALANCE = -15237 Hex = FFFFC47B Octal = 37777742173
숫자의 내부 저장
숫자는 내부적으로 긴 단어라는 부호형 4바이트 정수로 저장됩니다. 양수는 0~2147483647의 값을 가지고 음수는 4294967296에서 숫자의 절대 값을 뺀 값을 가집니다. 예를 들어, 숫자 -15237은 4294952059로 저장됩니다. 음수는 ASCII나 십진 표시인 경우 빼기 기호 형식으로 다시 변환되지만 16진수와 8진수 표시인 경우는 변환되지 않습니다. 예를 들어, 숫자 -15237은 16진수 -00003B85가 아닌 16진수 FFFFC47B(10진수 4294952059)로 표시됩니다.
숫자는 ASCII 규약을 사용하여 일련의 숫자로 텍스트 파일에 저장됩니다. 예를 들어, 숫자 1은 49의 저장 값을 가집니다.
숫자 식에서 포함되는 값은 리터럴 숫자(예: 3)이거나 숫자 값을 갖는 기호이어야 합니다. 또한, 숫자를 나타내는 문자열(예: “23” 또는 “-51”)을 사용할 수 있습니다. 숫자와 문자열 간의 연산 또는 비교를 수행할 경우 DCL은 문자열을 숫자로 변환합니다.
숫자 식은 다음 값(피연산자라고 함)을 합칩니다.
정수. 예를 들면 다음과 같습니다.
$ COUNT = 1
정수로 평가되는 렉시칼 함수. 예를 들면 다음과 같습니다.
$ B = F$INTEGER("-9" + 23)
정수 값을 갖는 기호. 예를 들면 다음과 같습니다.
$ A = B - 6
앞의 보기에서 기호 B는 F$INTEGER 함수에서 반환하는 정수 값(-923)을 나타냅니다.
이 정수 피연산자를 다음 절에서 설명하는 대로 산술, 논리 및 비교 연산자로 연결할 수 있습니다.
산술 연산 수행
다음과 같은 산술 연산을 지정할 수 있습니다.
곱하기
별표(*)는 두 숫자를 곱합니다.
나누기
슬래시(/)는 지정한 첫 번째 숫자를 지정한 두 번째 숫자로 나눕니다. 숫자가 정확히 나눠지지 않으면 나머지는 버립니다. 반올림은 하지 않습니다.
더하기
더하기 기호(+)는 두 숫자를 더합니다.
빼기
빼기 기호(-)는 지정된 첫 번째 숫자에서 지정된 두 번째 숫자를 뺍니다.
단항 가산 및 감산
더하기와 빼기 기호는 뒷 숫자의 부호를 변경합니다.
보기
다음 보기에서는 기호를 할당할 때 곱하기 사용을 보여 줍니다.
$ BALANCE = 142 * 14
$ SHOW SYMBOL BALANCE
BALANCE = 1988 Hex = 000007C4 Octal = 00000003704
다음 보기에서는 기호를 할당할 때 나누기 사용을 보여 줍니다.
$ BALANCE = BALANCE / 14
$ SHOW SYMBOL BALANCE
BALANCE = 142 Hex = 0000008E Octal = 00000000216
다음 보기에서는 기호를 할당할 때 더하기 사용을 보여 줍니다.
$ BALANCE = BALANCE + 37
$ SHOW SYMBOL BALANCE
BALANCE = 179 Hex = 000000B3 Octal = 00000000263
다음 보기에서는 기호를 할당할 때 빼기 사용을 보여 줍니다.
$ BALANCE = BALANCE - 15416
$ SHOW SYMBOL BALANCE
BALANCE = -15237 Hex = FFFFC47B Octal = 00000142173
다음 보기에서는 단항 감산 기호를 사용하여 숫자 -142의 부호를 변경하는 것을 보여 줍니다.
$ BALANCE = -(- a142)
$ SHOW SYMBOL BALANCE
BALANCE = 142 Hex = 0000008E Octal = 00000000216
숫자 비교
표 12-5에서는 숫자 비교의 여러 유형을 나열합니다.
표 12-5 숫자 비교
비교
연산자
설명
같음
.EQ.
두 숫자가 동일한지 비교합니다.
크거나 같음
.GE.
한 숫자와 다른 숫자를 비교하여 첫 번째 숫자에 크거나 같은 값이 있는지 확인합니다.
큼
.GT.
한 숫자와 다른 숫자를 비교하여 첫 번째 숫자에 큰 값이 있는지 확인합니다.
작거나 같음
.LE.
한 숫자와 다른 숫자를 비교하여 첫 번째 숫자에 작거나 같은 값이 있는지 확인합니다.
작음
.LT.
한 숫자와 다른 숫자를 비교하여 첫 번째 숫자에 작은 값이 있는지 확인합니다.
같지 않음
.NE.
두 숫자가 같지 않은지 비교합니다.

다음 보기에서는 기호 BALANCE의 값이 -15237이라고 가정합니다.
다음 보기에서 TEST_BALANCE는 1(참)로 평가됩니다.
BALANCE는 -15237과 같습니다.
$ TEST_BALANCE = BALANCE .EQ. -15237
$ SHOW SYMBOL TEST_BALANCE
TEST_BALANCE = 1 ...
다음 보기에서 TEST_BALANCE는 1(참)로 평가됩니다.
BALANCE는 -15237보다 크거나 같습니다.
$ TEST_BALANCE = BALANCE .GE. -15237
$ SHOW SYMBOL TEST_BALANCE
TEST_BALANCE = 1 ...
다음 보기에서 TEST_BALANCE는 0(거짓)으로 평가됩니다.
BALANCE는 -15237보다 크지 않습니다.
$ TEST_BALANCE = BALANCE .GT. -15237
$ SHOW SYMBOL TEST_BALANCE
TEST_BALANCE = 0 ...
다음 보기에서 TEST_BALANCE는 1(참)로 평가됩니다.
BALANCE는 -15237보다 작거나 같습니다.
$ TEST_BALANCE = BALANCE .LE. -15237
$ SHOW SYMBOL TEST_BALANCE
TEST_BALANCE = 1 ...
다음 보기에서 TEST_BALANCE는 0(거짓)으로 평가됩니다.
BALANCE는 -15237보다 작지 않습니다.
$ TEST_BALANCE = BALANCE .LT. -15237
$ SHOW SYMBOL TEST_BALANCE
TEST_BALANCE = 0 ...
다음 보기에서 TEST_BALANCE는 0(거짓)으로 평가됩니다.
BALANCE는 -15237과 같습니다.
$ TEST_BALANCE = BALANCE .NE. -15237
$ SHOW SYMBOL TEST_BALANCE
TEST_BALANCE = 0 ...
숫자 오버레이 수행
특수한 형식의 할당문을 사용하여 현재 기호 값의 이진(비트 수준) 오버레이를 수행할 수 있습니다. 로컬 기호인 경우 형식은 다음과 같습니다.
symbol-name[bit-position,size] = replacement-expression
글로벌 기호인 경우 형식은 다음과 같습니다.
symbol-name[bit-position,size] == replacement-expression
요소는 다음과 같습니다.
표 12-6
bit-position
비트 0을 기준으로 오버레이가 일어날 위치를 나타내는 정수.
size
오버레이될 비트 수를 나타내는 정수.

숫자 오버레이를 사용하려면 다음 규칙을 따릅니다.
대괄호([])는 필수적으로 사용해야 합니다. 여는 대괄호와 기호 이름 사이에 공백이 있어서는 안 됩니다.
리터럴 값을 10진수로 간주합니다.
크기의 최대 길이는 32비트입니다.
대체 식은 숫자 식이어야 합니다.
기호 이름이 정의되어 있지 않거나 문자열로 정의되어 있는 경우 오버레이의 결과는 문자열입니다. 그렇지 않으면 결과는 정수입니다.
다음 보기에서는 기호 BELL을 값 7로 정의합니다. BELL의 최하위 바이트는 이진 값 00000111을 가집니다. 오프셋 5의 0을 1로 변경하여(0에서 시작하여 오른쪽에서 왼쪽으로 비트 수 계산) 이진 값 00100111(십진 값 39)을 만듭니다.
$ BELL = 7
$ BELL[5,1] = 1
$ SHOW SYMBOL BELL
BELL = 39 Hex = 00000027 Octal = 00000000047
논리 값 및 식 사용
다음 절에서는 논리 값 및 식을 사용하는 방법을 설명합니다.
논리 연산
일부 연산에서는 숫자와 문자열을 다음 값의 논리 데이터로 변환합니다.
참(True)
숫자는 홀수(즉, 최하위 비트가 1)인 경우 참의 논리 값을 가집니다. 문자열은 첫 문자가 대문자나 소문자 T 또는 Y인 경우 참의 논리 값을 가집니다.
거짓(False)
숫자는 짝수(즉, 최하위 비트가 0)인 경우 거짓의 논리 값을 가집니다. 문자열은 첫 문자가 대문자나 소문자 T 또는 Y가 아닌 경우 거짓의 논리 값을 가집니다.
다음 보기에서는 DOG_COUNT에 값 13을 할당합니다. IF STATUS는 STATUS의 논리 값이 참인 경우를 의미합니다.
$ STATUS = 1
$ IF STATUS THEN DOG_COUNT = 13
$ STATUS = "TRUE"
$ IF STATUS THEN DOG_COUNT = 13
논리식
논리 연산자는 적용될 숫자의 모든 비트에 영향을 미칩니다. 논리식의 값이 정수이면 식의 결과도 정수입니다. 논리식에 문자열 값을 지정할 경우 식이 평가되기 전에 문자열이 정수로 변환됩니다.
일반적으로 논리식을 사용하여 논리 값의 최하위 비트를 평가합니다. 즉, 값이 참인지 거짓인지 결정합니다. 다음과 같은 논리 연산을 지정할 수 있습니다.
.NOT.
연산자 .NOT.은 논리 값의 비트 구성을 반대로 만듭니다. 참 값은 거짓이 되고 거짓 값은 참이 됩니다.
.AND.
연산자 .AND.는 두 논리 값을 다음과 같이 결합합니다.
표 12-7
비트 수준
엔터티 수준
1 .AND. 1 = 1
true .AND. true = true
1 .AND. 0 = 0
true .AND. false = false
0 .AND. 1 = 0
false .AND. true = false
0 .AND. 0 = 0
false .AND. false = false

.OR.
연산자 .OR.은 두 논리 값을 다음과 같이 결합합니다.
표 12-8
비트 수준
엔터티 수준
1 .OR. 1 = 1
true .OR. true = true
1 .OR. 0 = 1
true .OR. false = true
0 .OR. 1 = 1
false .OR. true = true
0 .OR. 0 = 0
false .OR. false = false

다음 보기에서는 참 값을 거짓으로 되돌립니다. 이 표현식은 -2로 평가되는데 이 값은 짝수이므로 거짓입니다.
$ SHOW SYMBOL STATUS
STATUS = 1 Hex = 00000001 Octal = 00000000001
$ STATUS = .NOT. STATUS
$ SHOW SYMBOL STATUS
STATUS = -2 Hex = FFFFFFFE Octal = 37777777776
다음 보기에서는 참 값과 거짓 값을 결합해 거짓 값을 만듭니다.
$ STAT1 = "TRUE"
$ STAT2 = "FALSE"
$ STATUS = STAT1 .AND. STAT2
$ SHOW SYMBOL STATUS
STATUS = 0 Hex = 00000000 Octal = 00000000000
다음 보기에서는 참 값과 거짓 값을 결합해 참 값을 만듭니다.
$ STAT1 = "TRUE"
$ STAT2 = "FALSE"
$ STATUS = STAT1 .OR. STAT2
$ SHOW SYMBOL STATUS
STATUS = 1 Hex = 00000001 Octal = 00000000001
논리 연산 결과
다음 표에서는 비트별 및 숫자별 논리 연산 결과를 보여 줍니다. 논리 연산에서 대문자나 소문자 T 또는 Y로 시작하는 문자열은 숫자 1로 처리되고 다른 문자로 시작하는 문자열은 숫자 0으로 처리됩니다. 논리 연산에서 홀수는 참이고 짝수와 0은 거짓입니다.
표 12-9
조건:
비트 A
비트 B
결과:
.NOT. A
A .AND. B
A .OR. B
1
1
0
1
1
1
0
0
0
1
0
1
1
0
1
0
0
1
0
0
표 12-10
조건:
숫자 A
숫자 B
결과:
.NOT. A
A .AND. B
A .OR. B
홀수
홀수
짝수
홀수
홀수
홀수
짝수
짝수
짝수
홀수
짝수
홀수
홀수
짝수
홀수
짝수
짝수
홀수
짝수
짝수

렉시칼 함수에서 반환한 값 사용
일반적으로 명령 프로시저에서 사용되는 렉시칼 함수는 시스템에서 시스템 프로세스, 일괄 처리 및 인쇄 대기열, 사용자 프로세스 등에 대한 정보를 포함한 정보를 검색합니다. 렉시칼 함수를 사용하여 문자열을 조작하고 논리 이름을 변환할 수도 있습니다. 렉시칼 함수를 기호에 할당할 때 기호는 렉시칼 함수에서 반환한 정보(예: 숫자 또는 문자열)를 나타냅니다. 그런 다음 DCL 수준에서 DCL 명령 SHOW SYMBOL을 사용하여 정보를 표시할 수 있습니다. 명령 프로시저에서 기호에 저장된 정보를 나중에 사용할 수 있습니다. 렉시칼 함수에 대한 자세한 내용은 15장을 참조하십시오.
렉시칼 함수를 사용하려면 렉시칼 함수의 이름(항상 F$로 시작)과 그 인수 목록을 지정해야 합니다. 다음 형식을 사용합니다.
F$function-name(args[,...])
인수 목록은 함수 이름 다음 간격 사이마다 여러 공백과 탭을 넣습니다.
렉시칼 함수를 사용할 때 다음 규칙을 따릅니다.
인수 목록은 괄호로 묶습니다.
목록에서 인수를 정확한 순서로 지정하고 쉼표로 구분합니다. 선택적인 인수는 생략하더라도 쉼표는 생략하지 마십시오.
인수가 필요하지 않은 경우 비어 있는 괄호 집합을 입력합니다.
식 작성 규칙을 따릅니다. 문자열은 인용 부호로 묶고 정수, 기호 및 렉시칼 함수는 인용 부호로 묶지 않습니다.
문자열, 정수 및 기호를 사용하는 것과 마찬가지로 렉시칼 함수를 사용합니다. 표현식에 렉시칼 함수를 사용하면 DCL은 함수를 자동으로 평가하고 반환 값으로 함수를 대체합니다.
다음 보기에서 F$LENGTH 함수는 인수인 BUMBLEBEE로 지정된 값의 길이를 반환합니다. DCL은 자동으로 반환 값(9)을 결정하고 이 값을 사용하여 식을 평가합니다. 따라서, 식(9 + 1)의 결과는 10이 되고 이 값은 기호 SUM에 할당됩니다.
$ SUM = F$LENGTH("BUMBLEBEE") + 1
$ SHOW SYMBOL SUM
SUM = 10 Hex = 0000000A Octal = 00000000012
각 렉시칼 함수는 정수 또는 문자열로 정보를 반환합니다. 또한, 렉시칼 함수의 인수를 정수 또는 문자열 식으로 지정해야 합니다.
예를 들어, F$LENGTH 함수는 문자열 표현식인 인수를 필요로 하며 정수인 값을 반환합니다. 앞의 보기에서 인수 “BUMBLEBEE”은 문자열 표현식이고 반환 값 (9)는 정수입니다.
기호를 사용할 수 있는 위치에는 어디에나 렉시칼 함수를 사용할 수 있습니다. 기호를 어포스트로피로 묶어서 기호 대체를 강제로 수행해야 하는 위치(기호 대체 이해 참조)에서는 렉시칼 함수를 어포스토로피 내에 넣어 렉시칼 함수 평가를 강제로 수행해야 합니다. 렉시칼 함수도 다른 렉시칼 함수의 인수로 사용할 수 있습니다.
다음 보기들에서는 F$LENGTH 함수의 인수를 지정할 수 있는 여러 방법을 보여 줍니다. 각 보기에서 인수는 문자열 표현식입니다.
다음 보기에서는 인수로 사용되는 기호를 보여 줍니다.
$ BUG = "BUMBLEBEE"
$ LEN = F$LENGTH(BUG)
$ SHOW SYMBOL LEN
LEN = 9 Hex = 00000009 Octal = 00000000011
기호 BUG를 인수로 사용할 때 인용 부호로 묶지 마십시오. 렉시칼 함수는 자동으로 BUG를 값 “BUMBLEBEE”로 대체하고 길이를 결정하여 값 9를 반환합니다.
다음 보기에서는 기호와 문자열을 모두 포함하는 인수를 보여 줍니다.
$ BUG = "BUMBLEBEE"
$ LEN = F$LENGTH(BUG)
$ SHOW SYMBOL LEN
LEN = 9 Hex = 00000009 Octal = 00000000011
$ LEN = F$LENGTH(BUG + "S")
$ SHOW SYMBOL LEN
LEN = 10 Hex = 0000000A Octal = 00000000012
기호 BUG는 인용 부호로 묶지 않았지만 문자열 “S”는 그렇게 했습니다. F$LENGTH 함수에서 길이를 결정할 수 있으려면 인수가 평가되어야 합니다.
기호 BUG(“BUMBLEBEE”)가 나타내는 값이 문자열 “S”와 연결되어 “BUMBLEBEES”라는 결과가 됩니다. F$LENGTH 함수에서는 문자열 “BUMBLEBEES”의 길이를 결정하고 값 10을 반환합니다.
다음 보기에서는 F$LENGTH 함수의 인수로 다른 렉시칼 함수를 사용합니다. F$DIRECTORY 함수는 대괄호와 함께 현재의 기본 디렉토리 이름을 반환합니다. 다음 보기에서 현재 기본 디렉토리는 [SALMON]입니다.
$ LEN = F$LENGTH(F$DIRECTORY() )
$ SHOW SYMBOL LEN
LEN = 8 Hex = 00000008 Octal = 00000000010
F$DIRECTORY 함수가 인수로 사용될 경우 이 함수를 인용 부호로 묶으면 안 됩니다. 함수는 자동으로 평가됩니다. F$DIRECTORY 함수의 결과가 반환되어야 F$LENGTH 함수에서 길이를 결정할 수 있 습니다. 그런 다음 F$LENGTH 함수에서는 대괄호를 포함하여 기본 디렉토리의 길이를 결정합니다.
작업 순서
표현식은 여러 연산과 비교를 포함할 수 있습니다. 다음 표에서는 식에 둘 이상의 연산자가 있을 경우 계산되는 순서에 따라 연산자를 나열합니다. 우선 순위가 높은 것에서 낮은 것 순으로 나열되어 있습니다. 즉, 표의 맨 위에 있는 연산자가 맨 아래에 있는 연산자보다 먼저 실행됩니다.
표 12-11
우선 순위
연산
7
단항 가산(+) 및 감산(-)
6
곱하기 (*) 및 나누기(/)
5
더하기(결합) 및 제거(빼기)
4
모든 숫자와 문자 비교
3
논리 .NOT. 연산
2
논리 .AND. 연산
1
논리 .OR. 연산

식에 같은 우선 순위의 연산자가 포함되어 있는 경우 연산은 왼쪽에서 오른쪽으로 수행됩니다. 처음에 수행할 연산을 괄호로 묶어 일반적인 우선 순위(연산과 비교가 평가되는 순서)를 무시할 수 있습니다. 괄호를 중첩시킬 수도 있습니다.
다음 보기에서는 괄호를 사용하여 곱하기 전에 더하기를 수행합니다. 괄호가 없으면 곱하기가 먼저 수행되어 결과는 26이 됩니다.
$ RESULT = 4 * (6 + 2)
$ SHOW SYMBOL RESULT
RESULT = 32 Hex = 00000020 Octal = 00000000040
데이터 유형 평가
기호에 대한 DCL 평가의 결과는 문자열이나 정수 값 중 하나입니다. 기호가 문자인지 정수인지는 현재 할당된 값의 데이터 유형에 따릅니다. 데이터 유형은 영구적이지 않습니다. 값의 데이터 유형이 변경되면 기호의 데이터 유형도 변경됩니다.
표현식에는 사용된 값의 유형과 연산자에 따라 정수나 문자열 값이 포함됩니다.
다음 보기에서는 로컬 기호 NUM이 처음에는 문자 값이 할당되고 이후 정수 식을 할당할 때 정수 값으로 변환됩니다.
$ NUM = "ABC"
$ NUM = 2 + 5
다음 표에서는 DCL에서 표현식을 평가하는 방법을 요약합니다. 첫 열에서는 표현식에서 사용할 수 있는 여러 값과 연산자를 나열하고 두 번째 열에서는 각 경우에 전체 표현식과 일치하는 값이 무엇인지 알려 줍니다. 표에서 임의의 값은 문자열이나 정수를 나타냅니다.
표 12-12
표현식
결과 값 유형
정수 값
정수
문자열 값
문자열
정수 렉시칼 함수
정수
문자열 렉시칼 함수
문자열
정수 기호
정수
문자열 기호
문자열
+, - , .NOT. 임의의 값
정수
임의의 값 .AND. 또는 .OR. 임의의 값
정수
문자열 + 또는 - 문자열
문자열
정수 + 또는 - 임의의 값
정수
임의의 값 + 또는 - 정수
정수
임의의 값 * 또는 / 임의의 값
정수
임의의 값 (문자열 비교) 임의의 값
정수
임의의 값 (숫자 비교) 임의의 값
정수

표현식에서 값 유형 변환
DCL에서 식을 계산할 수 있으려면 표현식의 피연산자가 같은 값 데이터 유형이어야 합니다. 값은 문자열이나 정수 데이터 유형이 될 수 있습니다. 문자열 데이터에는 문자열, 문자열 값을 갖는 기호 및 문자열 값을 반환하는 렉시칼 함수가 포함됩니다. 정수 데이터는 정수, 정수 값을 갖는 기호 및 정수 값을 반환하는 렉시칼 함수를 포함합니다. 표현식에 숫자와 문자열 피연산자가 모두 있으면 DCL은 모든 문자열을 정수로 또는 모든 정수를 문자열로 변환합니다.
일반적으로 문자열과 정수 값을 모두 사용할 경우 문자열 값이 정수로 변환되지만 DCL에서 문자열 비교를 수행할 때에만 예외입니다. 이런 비교에서는 정수가 문자열로 변환됩니다.
또한, 다음 렉시칼 함수를 사용하여 표현식의 값을 결정 또는 변경할 수 있습니다.
F$TYPE - 기호의 현재 값 유형 결정
F$INTEGER - 문자열 표현식을 정수 값으로 변환
F$STRING - 정수 표현식을 문자열 값으로 변환
문자열을 정수로 변환
다음과 같이 문자열을 정수로 변환합니다.
숫자를 포함하는 문자열은 해당 정수 값으로 변환됩니다. 예를 들어, 문자열 “45”는 정수 45로 변환됩니다.
문자열이 T, t, Y 또는 y로 시작하면 정수 1로 변환됩니다.
문자열이 다른 문자로 시작하면 정수 0으로 변환됩니다.
다음 표에서는 문자열이 정수 값으로 변화되는 예를 보여 줍니다.
표 12-13
문자열
결과 정수
“123”
123
“12XY”
0 (거짓)
“Test”
1 (참)
“hello”
0 (거짓)

정수에서 문자열로 변환
정수가 문자열로 변환될 때 결과 문자열에는 정수 값에 해당하는 숫자가 포함됩니다. 다음 표에서는 정수가 문자열로 변환되는 방법을 보여 줍니다.
표 12-14
정수
결과 문자열
123
“123”
1
“1”
0
“0”

기호 표 이해
기호는 운영 체제에서 관리하는 로컬 또는 글로벌 기호 표에 저장됩니다.
로컬 기호 표
DCL에서는 사용자가 명령 프로시저를 실행하거나 CALL 명령을 사용하거나 일괄 처리 작업을 제출할 때 만드는 모든 명령 수준과 사용자의 기본 프로세스의 로컬 기호 표를 유지 관리합니다. 사용자가 로컬 기호를 만들면 DCL은 해당 기호를 현재 명령 수준의 로컬 기호 표에 저장합니다. 명령 수준이 활성이면 DCL은 해당 명령 수준의 로컬 기호 표를 유지합니다. 명령 수준이 더 이상 활성이 아니면 로컬 기호 표와 여기에 포함된 모든 기호가 삭제됩니다. 프로세스, 명령 프로시저 및 일괄 처리 작업에 대한 자세한 내용은 16장을 참조하십시오.
로컬 기호 표에는 사용자가 만든 로컬 기호와 더불어 DCL에서 관리하는 8개의 기호가 들어 있습니다. 이 기호(P1, P2 등)는 명령 프로시저에 매개 변수를 전달하기 위해 사용됩니다. 명령 프로시저에 전달되는 매개 변수는 문자열로 간주됩니다. 또는 P1~P8이 null 문자열(“ ”)로 정의됩니다. 이 기호는 로컬 기호 표에 저장됩니다.
글로벌 기호 표
DCL에서는 프로세스 지속 기간 동안 하나의 글로벌 기호 표만을 유지하며 모든 글로벌 기호를 이 표에 저장합니다. 글로벌 기호 표는 사용자가 만든 글로벌 기호와 함께 예약된 글로벌 기호를 포함합니다. 이 글로벌 기호는 시스템 명령 및 유틸리티와 프로그램 및 명령 프로시저에 대한 상태 정보를 제공합니다.
$STATUS 예약된 글로벌 기호
$STATUS는 가장 최근에 실행된 명령에서 반환하는 조건 코드입니다.
기호 $STATUS는 OpenVMS 운영 체제 메시지 코드를 확인합니다. 어플리케이션에서는 EXIT 명령에 매개 변수 값을 포함시켜 글로벌 기호 $STATUS 값을 설정할 수 있습니다. 시스템은 $STATUS 값을 사용하여 표시할 메시지(있는 경우)와 다음 상위 명령 수준에서 실행을 계속할지 여부를 결정합니다. $STATUS의 가장 낮은 세 개 비트의 값은 글로벌 기호 $SEVERITY에 저장됩니다.
$SEVERITY 예약된 글로벌 기호
$SEVERITY는 가장 최근에 실행된 명령에서 반환하는 조건 코드의 심각도 수준입니다. $STATUS의 최하위 비트와 일치하는 기호 $SEVERITY는 다음 값을 가질 수 있습니다.
표 12-15
0
경고
1
성공
2
오류
3
정보
4
심각한(치명적) 오류

$RESTART 예약된 글로벌 기호
$RESTART의 값은 일괄 처리 작업이 시스템 실패로 중단된 후 다시 시작된 경우 TRUE이고 그렇지 않은 경우 FALSE입니다.
기호 표 검색 순서
명령 인터프리터에서 기호 값을 결정할 때 다음과 같은 순서로 기호 표를 검색합니다.
1. 현재 명령 수준의 로컬 기호 표
2. 현재 수준으로부터 거꾸로 이전 명령 수준의 로컬 기호 표 검색
3. 글로벌 기호 표
기호 값 마스크
다음 절에서는 값 기호를 마스킹하는 방법을 설명합니다.
SET SYMBOL 명령
기본적으로 외부 명령 프로시저 수준에서 정의된 모든 기호(글로벌 및 로컬 모두)는 내부 프로시저 수준에 액세스할 수 있습니다. 그러나 SET SYMBOL 명령을 사용하여 명령 프로시저의 로컬 또는 글로벌 기호를 다른 명령 프로시저에서 정의된 기호와 분리할 수 있습니다. SET SYMBOL 명령은 로컬 및 글로벌 기호의 값을 삭제하지 않고 마스킹합니다. 따라서 명령 프로시저에서 다른 명령 프로시저를 실행할 경우 두 번째 프로시저에서 SET SYMBOL 명령을 지정하면 두 프로시저 모두에서 같은 기호 이름을 사용할 수 있습니다.
SET SYMBOL 명령은 또한, DCL에서 명령행을 처리하기 전에 동사 문자열(명령행의 첫 단어)을 기호로 변환하려 하는지 여부를 제어합니다. 기본 동작은 변환을 시도하는 것입니다. 이 동작을 변경하면 명령 프로시저에서 명령을 호출할 때 외부 프로시저 수준 환경에 영향을 받지 않는다는 장점이 있습니다.
기호 범위 상태
로컬 및 글로벌 기호의 기호 범위는 다릅니다. 이전 프로시저로 되돌아가기 위해 프로시저 수준을 종료하면 이전 수준의 기호 범위 컨텍스트가 로컬과 글로벌 기호 모두에 대해 복원됩니다.
현재의 일반적인 기호 범위 상태를 표시하려면 렉시칼 함수 F$ENVIRONMENT('SYMBOL_SCOPE')를 사용합니다. 현재의 동사 범위 상태를 표시하려면 렉시칼 함수 F$ENVIRONMENT(“VERB_SCOPE”)를 사용합니다.
로컬 기호 범위
로컬 기호는 프로시저 수준에 종속됩니다. 외부 프로시저 수준에서 로컬 기호를 정의하면 이 기호는 모든 내부 프로시저 수준에서 읽을 수 있습니다(쓰기는 안 됨). 외부 프로시저 수준의 로컬인 기호에 값을 할당하면 새 기호가 현재 프로시저 수준에서 만들어집니다. 그러나 외부 프로시저 수준의 기호는 수정되지 않습니다.
SET SYMBOL/SCOPE=NOLOCAL 명령을 사용하면 외부 프로시저 수준에서 정의된 모든 로컬 기호를 현재 프로시저 수준과 모든 내부 수준에서 액세스할 수 없게 됩니다. 예를 들어, 프로시저 수준 2와 4에서 SET SYMBOL/SCOPE=NOLOCAL을 지정하는 경우 다음과 같습니다.
프로시저 수준 2에서는 수준 2 로컬 기호만 읽고 쓸 수 있습니다.
프로시저 수준 3에서는 수준 2 로컬 기호를 읽기만 할 수 있습니다(쓰기는 안 됨). 수준 3은 수준 3 로컬 기호도 읽고 쓸 수 있습니다.
프로시저 수준 4에서는 수준 4 로컬 기호만 읽고 쓸 수 있습니다.
글로벌 기호 범위
글로벌 기호는 프로시저 수준에 관계 없습니다. 현재 글로벌 기호 범위 컨텍스트가 후속적으로 모든 프로시저 수준에 적용됩니다.
/SCOPE=NOGLOBAL 한정자를 지정하면 /SCOPE=GLOBA 한정자를 지정하거나 글로벌 기호를 액세스할 수 있는 이전 수준으로 빠져 나가지 않는 한 모든 글로벌 기호를 후속하는 모든 명령에서 액세스할 수 없게 됩니다. 또한, /SCOPE=NOGLOBAL 한정자를 지정하면 /SCOPE=GLOBAL 한정자를 지정하기 전까지 새 글로벌 기호를 만들 수 없습니다.
기호 대체 이해
특정 상황에서 DCL은 기호 이름이나 렉시칼 함수와 같은 문자로 시작하는 문자열을 사용합니다. 이런 상황에서 DCL은 기호 또는 렉시칼 함수를 해당 값으로 대체하려고 합니다. 기호를 현재 값으로 대체하는 것을 기호 대체라고 합니다. 다른 상황에서 기호나 렉시칼 함수를 사용할 경우 대체 연산자를 사용하여 기호 대체를 요청해야 합니다.
DCL은 기호와 렉시칼 함수를 다음과 같이 사용할 경우 자동으로 평가합니다.
할당(=) 문의 오른쪽에서
렉시칼 함수의 인수에서
IDEPOSIT, EXAMINE, IF 또는 WRITE 명령에서
문자열 다음에 등호 또는 콜론이 올 때 명령행의 시작 부분에서
부분 문자열 대체나 숫자 오버레이(부분 문자열 대체 참조)를 수행하고 있을 때 할당문의 왼쪽에 있는 대괄호에서
다음 보기에서는 명령 인터프리터가 영문자로 시작하는 문자열을 기호 이름으로 사용하고 숫자나 기수 연산자(%)로 시작하는 문자열을 리터럴 숫자 값으로 사용합니다.
다음 보기에서 COUNT는 자동으로 기호로 인식되고 계산됩니다.
$ TOTAL = COUNT + 1
이 보기의 두 번째 줄에서 기호 QUERY는 F$LENGTH 함수에서 사용될 때 자동으로 계산됩니다. 또한, F$LENGTH 함수는 할당문의 오른쪽에 있으므로 자동으로 계산됩니다.
$ QUERY = "Have we met before?"
$ LEN = F$LENGTH(QUERY) + 5
$ SHOW SYMBOL LEN
LEN = 27 Hex = 0000001B Octal = 000033
다음 보기에서 IF 명령은 A와 B를 기호 이름으로 사용하여 그 현재 값을 사용합니다.
$ IF A .EQ. B THEN WRITE SYS$OUTPUT "DONE"
이 보기의 두 번째 줄에서 명령 인터프리터는 자동으로 PDEL을 현재 값으로 대체하고 결과 명령을 실행합니다.
$ PDEL = "DELETE SYS$PRINT/ENTRY="
$ PDEL 181
다음 보기에서 DCL은 자동으로 기호 BELL을 7의 값으로 정의하고 할당문의 왼쪽에 있는 괄호 안의 값에 따라 새 값을 할당합니다.
$ BELL = 7
$ BELL[5,1] = 1
$ SHOW SYMBOL BELL
BELL = 39 Hex = 00000027 Octal = 00000000047
강제 기호 대체
나열된 위치 중 하나에 없는 기호를 강제로 대체하려면 다음과 같이 기호를 어포스트로피(')로 묶습니다.
$ TYPE 'B'
인용된 문자열 내의 기호를 강제로 대체하려면 다음과 같이 해당 기호 앞에 두 개의 어포스트로피(')를 붙이고 기호 뒤에 한 개의 어포스트로피(')를 붙입니다.
$ T = "TYPE ''B'"
명령행을 처리할 때 DCL은 다음과 같은 순서로 기호를 해당 값으로 대체합니다.
강제 대체
DCL은 왼쪽에서 오른쪽으로 어포스트로피(또는 인용 부호 내의 문자열인 경우 두 개의 어포스트로피)로 분리된 모든 문자열을 대체합니다. 한 개의 어포스트로피가 앞에 오는 기호는 반복적으로 변환되지만 두 개의 어포스트로피가 앞에 오는 기호는 그렇지 않습니다.
자동 대체
DCL은 왼쪽에서 오른쪽으로 명령행의 각 값을 평가하여 명령이면 실행하고 표현식이면 계산합니다. 표현식의 기호는 할당된 값으로 대체되지만 반복적으로 대체되지는 않습니다.
다음 보기에서는 DCL이 기호를 대체하는 순서에 따른 영향을 보여 줍니다. 우선 기호 PN, FILE1 및 NUM이 정의됩니다.
$ PN = "PRINT/NOTIFY"
$ FILE1 = "[BOLIVAR]TEST_CASE.TXT"
$ NUM = 1
기호가 정의되면 다음 명령은 [BOLIVAR]TEST_CASE.TXT라는 파일을 인쇄합니다.
$ FILE = "'FILE''NUM''"
$ PN 'FILE'
첫 번째 명령에서는 강제 대체로 NUM은 1이 되므로 'FILE' 'NUM'은 FILE1이 됩니다. 명령 SHOW SYMBOL FILE을 입력하면 FILE = “ 'FILE1' ”이 표시됩니다.
두 번째 명령은 두 가지 대체를 수행합니다. 우선 'FILE'이 'FILE1'로 대체됩니다. 'FILE1'도 어포스트로피(')로 묶이므로 대체가 필요합니다. 자동 대체로 FILE1은 [BOLIVAR]TEST_CASE.TXT가 됩니다. 그런 다음 이 파일 이름이 PRINT/NOTIFY인 PN 값에 추가됩니다. 따라서 다음과 같은 문자열이 됩니다.
$ PRINT/NOTIFY [BOLIVAR]TEST_CASE.TXT
기호 대체 연산자
DCL에서 통상적으로 대체를 수행하지 않는 경우 대체 연산자를 사용하여 기호 대체를 요청할 수 있습니다. DCL에서는 두 가지 대체 연산자를 사용할 수 있습니다.
어포스트로피(')
앰퍼샌드(&)
이 두 연산자는 대체가 일어나는 시간이 다릅니다. 어포스트로피가 앞에 붙은 기호는 DCL 명령 처리의 첫 번째 단계에 대체되지만 앰퍼샌드가 앞에 오는 기호는 두 번째 단계에 대체됩니다. 명령 처리 단계에 대한 자세한 내용은 명령 처리 3 단계를 참조하십시오.
어포스트로피(')
어포스트로피(')는 가장 자주 사용되는 대체 연산자입니다. 명령 매개 변수나 한정자 대신 기호를 사용할 때 기호 대체를 요청하려면 어포스트로피를 사용합니다. 어포스트로피를 사용하여 문자열 할당(:=) 문의 오른쪽에서 기호 대체를 요청합니다.
인용된 문자열에서 기호 대체를 요청하려면 기호 이름 앞에 두 개의 어포스트로피와 이름 뒤에 한 개의 어포스트로피를 붙입니다.
어포스트로피를 사용하여 기호 대체를 요청할 경우 대체 값의 중간에서 하이픈 연결 문자로 줄을 계속할 수 없습니다.
다음 보기에서 TYPE 명령은 파일 지정 방법을 필요로 합니다. 어포스트로피는 LIT가 평가되어야 하는 기호임을 나타냅니다. 어포스트로피를 생략하면 DCL은 LIT.LIS라는 파일을 찾습니다. .LIS는 TYPE 명령의 기본 파일 유형입니다.
$ LIT = "LIGHT.BILLS"
$ TYPE 'LIT'
다음 보기에서는 FILE이 REPORT.DAT가 되도록 NAME 값을 대체합니다.
$ NAME := REPORT
$ FILE := 'NAME'.DAT
$ SHOW SYMBOL FILE
FILE = "REPORT.DAT"
다음 보기에서 기호 NAME의 현재 값은 FRED입니다.
$ MESSAGE = "Creating file ''NAME'.DAT"
따라서 MESSAGE는 다음과 같은 값을 가집니다.
Creating file FRED.DAT
앰퍼샌드(&)
앰퍼샌드(&)도 명령 인터프리터에서 인식하는 대체 연산자입니다. 대부분의 경우 어포스트로피와 앰퍼샌드는 같은 기능을 수행합니다. 앰퍼샌드가 가장 효율적인 대체 연산자로 사용되는 경우는 어포스트로피와 함께 사용되어 대체가 수행되는 순서에 영향을 주는 경우입니다.
기호가 정의되지 않은 경우에 명령 인터프리터에서 수행하는 작업은 명령의 컨텍스트에 따라 다릅니다. 자세한 내용은 정의되지 않은 기호를 참조하십시오.
다음의 첫 번째 명령에서는 명령 인터프리터가 명령 처리의 첫 단계(스캔) 동안 기호 NAME을 현재 값으로 대체합니다. 두 번째 명령에서는 명령 처리의 두 번째 단계(구문 분석) 동안 기호 NAME을 현재 값으로 대체합니다. 방법은 다르지만 결과는 같습니다.
$ TYPE 'NAME'
$ TYPE &NAME
다음 보기에서는 어포스트로피와 함께 앰퍼샌드(&)를 사용하여 대체 순서에 영향을 줍니다.
$ P1 = "FRED.DAT"
$ COUNT = 1
$ TYPE &P'COUNT'
먼저 명령 인터프리터는 어포스트로피로 묶인 기호('COUNT')를 평가합니다.
결과는 다음과 같습니다.
TYPE &P1
두 번째로 명령 인터프리터는 앰퍼샌드가 앞에 오는 기호(P1)를 평가합니다.
결과는 다음과 같습니다.
TYPE FRED.DAT
다음 보기에서는 P와 COUNT 모두에 어포스트로피를 사용합니다.
$ TYPE 'P''COUNT'
명령 인터프리터는 왼쪽에서 오른쪽으로 작업하며 P를 평가합니다. P는 정의된 기호가 아니므로 DCL은 null 값을 부여합니다. 다음으로 기호 COUNT를 평가합니다. 결과는 다음과 같습니다.
TYPE 1
다음 보기에서 A는 B의 현재 값과 일치합니다.
$ B = "MYFILE.DAT"
$ A = "&B"
$ TYPE 'A'
앰퍼샌드(&)를 인용 부호(“ ”) 안에서 사용하면 기호 대체가 일어나지 않습니다. 따라서 할당할 때 B 값은 대체되지 않습니다. 그러나 TYPE 명령은 MYFILE.DAT를 표시합니다. 그 이유는 명령 인터프리터가 우선 A를 &B 값으로 대체한 다음 기호 &B를 MYFILE.DAT로 대체하기 때문입니다. B를 다시 정의하면 TYPE 명령의 결과도 따라 변합니다.
앰퍼샌드를 사용할 경우 다음 규칙을 따릅니다.
앰퍼샌드를 기호 이름 뒤가 아닌 앞에 놓습니다.
앰퍼샌드는 구분 기호(공백이나 특수 문자) 다음에 와야 합니다.
인용 부호( ”)로 묶인 문자열 내에서는 앰퍼샌드를 사용하여 대체를 요청할 수 없습니다.
두 개 이상의 기호 이름을 연결하기 위해 앰퍼샌드를 사용할 수 없습니다.
일반적으로 기호를 올바로 변환하기 위해 필요한 경우를 제외하고는 기호 대체를 위해 앰퍼샌드를 사용하지 않습니다.
명령 처리 3 단계
명령 인터프리터는 3 단계로 기호 대체를 수행합니다.
1 단계: 명령 입력 스캔
명령 입력 스캔(렉시칼 입력 단계라고도 함) 시 명령 인터프리터는 왼쪽에서 오른쪽으로 어포스트로피가 앞에 붙은 기호를 평가합니다. 한 개의 어포스트로피가 앞에 있는 기호는
1 단계 대체에서 설명한 대로 반복해서 변환하고 두 개의 어포스트로피가 앞에 오는 기호는 반복해서 변환하지 않습니다.
2 단계: 명령 구문 분석
명령 구문 분석 단계에서 다음을 수행합니다.
명령 인터프리터가 명령행을 분석합니다. 명령행의 첫 번째 항목이 기호인지 확인합니다. 기호이면 평가합니다.
명령 인터프리터가 왼쪽에서 오른쪽으로 어포스트로피가 앞에 붙은 기호를 평가합니다.
이 단계 동안의 기호 대체는 반복되지 않습니다.
3 단계: 표현식 평가
표현식 평가 단계에서는 다음을 수행합니다.
명령 인터프리터가 DEPOSIT, EXAMINE, IF 및 WRITE 명령이 앞에 오는 기호를 평가합니다.
명령 인터프리터가 렉시칼 함수 내의 기호를 평가합니다.
이 단계 동안의 기호 대체는 반복되지 않습니다.
명령 인터프리터는 명령 프로시저 내에서 실행된 명령이나 프로그램이 입력 데이터로 읽은 행은 스캔하지 않습니다. 따라서 명령 인터프리터는 이런 데이터 행에서 기호 대체를 수행하지 않습니다.
다음 보기에서는 프로그램 AVERAGE가 SYS$INPUT(명령 입력 스트림)에서 55, 57 및 9999를 읽습니다. 명령 인터프리터에서는 이 데이터 행을 읽지 않습니다. 입력 데이터로 입력한 기호 이름은 평가되지 않습니다.
$ RUN AVERAGE
55
57
9999
반복적인 대체
기호 대체는 반복될 수 있습니다.
단일 명령행에서 둘 이상의 대체 유형이 발생하는 경우 반복적인(Repetitive) 대체가 일어납니다.
명령 인터프리터에서 대체된 값 자체가 기호인지 확인하는 경우 반복적인(iterative) 대체가 발생합니다. 반복적인(iterative) 대체는 명령 처리의 1 단계에 어포스트로피가 앞에 붙은 기호를 변환할 때만 발생합니다.
1 단계 대체
어포스트로피(')를 사용하여 기호 대체를 요청하면 명령 인터프리터는 명령 처리의
1 단계 동안에 반복적인(iterative) 대체를 수행합니다.
기호가 인용된 문자열 안에 포함될 경우 어포스트로피를 사용한 대체가 반복되지 않습니다.
다음 보기에서는 대체가 반복됩니다.
$ MAC = "5"
$ A = "'MAC'"
$ B = 'A'
$ SHOW SYMBOL B
B = 5 Hex = 00000005 Octal = 00000000005
B = 'A' 문 이후에 기호 B의 값은 다음과 같은 이유로 5가 됩니다.
기호 이름 A는 어포스트로피로 묶여 있으므로 현재 값('MAC')으로 대체됩니다.
이 값('MAC')도 어포스트로피로 묶여 있으므로 명령 인터프리터는 MAC를 현재 값(5)으로 대체합니다.
이 값(5)에는 어포스트로피가 없으므로 명령 처리의 1 단계가 완료됩니다. 2 단계와 3 단계에서는 더 이상의 대체가 필요하지 않습니다. 따라서 5가 기호 이름 B에 지정되는 마지막 값이 됩니다.
그러나 인용된 문자열에 A를 포함시키면 다음과 같습니다.
$ B = "''A'"
$SHOW SYMBOL B
B = "'MAC'"
이 경우 B의 값은 'MAC'이 됩니다. 인용된 문자열 내에서는 대체가 반복되지 않으므로 기호 이름 A는 한 번만 대체됩니다.
2 단계 대체
명령 인터프리터는 명령행에 어포스트로피가 있는 경우에만 자동으로 반복적인(iterative) 대체를 수행합니다. 일부 경우에는 명령 동의의 정의를 중첩시킬 수도 있습니다.
다음 보기에서는 EXEC가 처리될 때 명령 인터프리터가 한 번만 대체를 수행합니다.
$ MAC = "TYPE A.B"
$ EXEC = "'MAC'"
$ EXEC
결과는 문자열 'MAC'이 됩니다. 명령 인터프리터는 MAC을 명령으로 인식하지 않으므로 오류 메시지를 표시합니다. 이 오류는 명령 처리 1단계에서 아무 대체도 수행되지 않았기 때문에 일어납니다(문자열 EXEC는 어포스트로피로 구분되지 않음). 2 단계에서 EXEC는 명령행이 첫 번째 값이므로 문자열 'MAC'으로 대체됩니다. 이 대체는 반복되지 않습니다. 따라서 'MAC'이 어포스트로피로 구분되어 있더라도 추가 대체가 수행되지 않습니다.
명령 동의어 EXEC를 올바로 사용하려면 다음과 같이 어포스트로피로 묶습니다.
$ 'EXEC'
이 경우 기호 EXEC는 명령 처리 1 단계에서 평가됩니다. 대체가 반복되므로 ('MAC' )도 평가되어 문자열 TYPE A.B가 대체됩니다.
3 단계 대체
명령 인터프리터가 명령의 표현식을 분석할 때 식에 지정된 기호는 한 번만 대체됩니다. 그러나 식에 어포스트로피나 앰퍼샌드를 사용하여 대체가 강제로 반복하게 할 수 있습니다. 이렇게 강제로 반복하게 할 경우 다음을 주의하십시오.
명령 인터프리터는 어포스트로피와 앰퍼샌드로 요청한 모든 대체를 명령행을 실행하기 전에 수행합니다.
기호 대체를 자동으로 수행하는 명령은 명령 처리 1 단계와 2 단계 이후에 실행됩니다.
그러나 유효한 기호 이름으로 대체되지 않을 경우 명령이 실패합니다.
다음 보기에서는 IF 명령에서의 반복적인 대체를 보여 줍니다.
$ P1 = "FRED.DAT"
$ COUNT = 1
$ IF P'COUNT' .EQS. "" THEN GOTO END
명령 인터프리터가 이 줄을 스캔할 때 기호 COUNT를 현재 값으로 대체합니다. 결과는 다음과 같습니다.
IF P1 .EQS. "" THEN GOTO END
이 문자열에는 어포스트로피가 없으므로 명령 인터프리터는 더 이상의 대체를 수행하지 않습니다. 그러나 IF 명령이 실행 될 때 기호 이름 P1를 자동으로 평가하여 현재 값으로 대체합니다.
다음 보기에서 기호 이름 FILENAME은 잘못되었습니다.
$ FILENAME = "A.B"
$ IF 'FILENAME' .NES. "" THEN TYPE 'FILENAME'
명령 인터프리터는 기호 FILENAME을 현재 값(A.B)으로 대체합니다. 결과는 다음과 같습니다.
IF A.B .NES. "" THEN TYPE A.B
IF 명령이 명령행을 실행할 때 A.B는 유효한 기호가 아니므로 오류가 일어납니다. 이 IF 명령을 올바로 처리하려면 다음과 같이 어포스트로피를 생략합니다.
$ IF FILENAME .NES. "" THEN TYPE 'FILENAME'
정의되지 않은 기호
기호가 명령행에서 사용될 때 정의되어 있지 않으면 명령 인터프리터는 상황에 따라 오류 메시지를 표시하거나 기호를 null 문자열로 대체합니다. 규칙은 다음과 같습니다.
명령 처리 1 단계와 2 단계에 명령 인터프리터는 어포스트로피나 앰퍼샌드가 앞에 오는 정의되지 않은 모든 기호를 null 문자열로 대체합니다.
명령 처리 3 단계에 명령 인터프리터는 정의되지 않은 기호를 찾으면 경고 메시지를 표시하고 처리를 마치지 않습니다.
다음 보기에서는 명령 인터프리터가 어포스트로피가 앞에 붙은 정의되지 않은 기호를 처리하는 방법을 보여 줍니다.
$ FILE := MYFILE'FILE_TYPE'
$ SHOW SYMBOL FILE
FILE = "MYFILE"
$ PRINT 'FILE'
기호 FILE이 만들어질 때 기호 FILE_TYPE은 현재 값으로 대체됩니다. FILE_TYPE가 정의되지 않은 경우 명령 인터프리터는 FILE_TYPE을 null 문자열로 대체합니다. 파일 지정 방법에 파일 유형이 없으므로 PRINT 명령은 기본 파일 유형 .LIS를 사용합니다. 따라서 파일 사용이 MYFILE.LIS로 변환됩니다.
다음 보기에서는 표현식이 명령 처리 3 단계에서 평가됩니다.
$ A = 1
$ C = A + B
%DCL-W-UNDSYM, undefined symbol - check validity and spelling
기호 B가 정의되어 있지 않으므로 명령 인터프리터는 식을 평가할 수 없습니다.
기호 사용에 대한 대안: 자동 외부 명령
프로시저에 대한 기호를 정의하지 않고 DCL 수준에서 명령 프로시저(.COM 파일 유형)를 호출하거나 실행 가능한 이미지(.EXE 파일 유형)를 실행할 수도 있습니다. DCL은 자동 외부 명령을 사용하여 명령 프로시저의 특정 디렉토리 집합이나 실행 가능한 이미지를 찾아 자동으로 실행할 수 있습니다.
DCL 기호가 아니며 DCL 명령 표에 없는 명령 동사를 입력하면 시스템은 일반적으로 다음 메시지를 표시합니다.
DCL-W-IVVERB, unrecognized command verb - check validity and spelling
그러나 논리 이름 DCL$PATH가 공백이 아니고 정의되어 있으면 DCL은 대신 파일 이름에 잘못된 동사를 포함하는 파일에 대해 RMS $SEARCH를 수행하고 기본 파일 지정 방법인 DCL$PATH:.*를 수행합니다.
DCL에서 .COM 또는 .EXE 파일을 찾으면 DCL은 나머지 명령행을 매개 변수로 사용하여 해당 파일을 자동으로 실행합니다. 이 동작은 DOS, UNIX 등의 다른 운영 체제에 있는 PATH 옵션과 비슷합니다.
다음 보기에서는 DCL 기호 SYSGEN이 더 이상 필요 없습니다. DCL은 SYS$SYSTEM 디렉토리를 조회하여 SYSGEN.EXE를 찾습니다. DCL은 “$SYS$SYSTEM:SYSGEN”으로 정의된 기호 “SYSGEN”과 같이 작동하여 SYSGEN 이미지가 외부 명령으로 활성화됩니다.
$ SYSGEN
%DCL-W-IVVERB, unrecognized command verb - check validity and spelling
\SYSGEN\
$ DEFINE DCL$PATH SYS$SYSTEM,SYS$DISK:[]FOO
$ SYSGEN SHOW MAXPROCESSCNT
Parameter Name Current Default Min. Max. Unit Dynamic
-------------- ------- ------- ------- ------- ---- ------- MAXPROCESSCNT 157 32 12 8192 Processes
다음 보기에서는 DCL이 자동으로 SYS$SYSTEM 디렉토리에서 SS.COM 또는 SS.EXE를 찾으므로 SS를 @SS.COM”으로 정의할 필요가 없습니다. DCL은 파일을 찾지 못하면 현재 디렉토리에서 SS.COM이나 SS.EXE를 찾습니다.
$ TYPE SS.COM
$ SHOW SYMBOL/LOCAL/ALL
$ EXIT
$ SS "This is a parameter"
P1 = "This is a parameter"
P2 = ""
P3 = ""
P4 = ""
P5 = ""
P6 = ""
P7 = ""
P8 = ""
$ SS.EXE "This is a parameter"
P1 = ".EXE"
P2 = "This is a parameter"
P3 = ""
P4 = ""
P5 = ""
P6 = ""
P7 = ""
P8 = ""
위의 보기에서 DCL은 SS.COM을 찾고 “SS”가 “@SS.COM”으로 정의된 기호인 것처럼 작동합니다. 구문 분석된 나머지 명령행 부분을 매개 변수로 사용하여 명령 프로시저가 활성화됩니다. “SS.EXE”에서는 이미지 SS.EXE를 호출하지 않고 대신 두 개의 매개 변수(첫 번째는 텍스트 문자열 “.EXE”임)와 함께 SS.COM을 호출합니다. 이는 OpenVMS 운영 체제에서 명령 구문 분석과 기호 대체가 수행되는 방법과 같습니다.
자동 외부 명령 사용
다음을 참고하십시오.
논리 이름 DCL$PATH는 검색 목록 형식 논리가 될 수 있습니다.
논리 이름의 각 변환 중 노드, 장치 및 디렉토리 부분만 사용됩니다.
일반 논리 우선 순위가 우선합니다. 사용자의 직접 정의하여 DCL$PATH에 대한 시스템 정의를 무시할 수 있습니다. 시스템 정의가 있는 데 사용자가 그 기능을 원하지 않을 경우 ”에 대한 정의로 논리를 무시하여 기능을 끌 수 있습니다.
DCL 동사와 기호 이름의 유효한 문자 집합이 파일 이름의 유효한 문자 집합과 다릅니다. 예를 들어, DCL 기호는 하이픈(-)을 포함할 수 없거나 달러 기호($)로 시작할 수 없습니다. 실행할 이미지나 프로시저가 DCL 기호 이름으로 유효하지 않은 경우 이 새 기능에서 직접 호출할 수 없습니다.
DCL은 명령을 구문 분석하지 않았습니다. 호출될 이미지에서 자체적으로 명령 구문 분석을 수행합니다. C 프로그램인 경우 main() 루틴에 argc”와 argv” 매개 변수를 사용합니다. 다른 언어로 작성된 프로그램인 경우 LIB$GET_FOREIGN을 호출하여 전체 명령행을 가져와서 프로그램에서 구문 분석해야 합니다.
디렉토리에는 명령 프로시저와 실행 가능한 이미지가 모두 들어 있는 경우 처음 찾은 파일이 무엇이든 호출됩니다. OpenVMS 시스템에서 디렉토리는 사전순으로 정렬되므로 .COM” 파일은 .EXE” 파일 앞에 있습니다. 다른 운영 체제를 실행하는 노드를 가리키는 DCL$PATH 논리의 네트워크 파일에서는 .EXE” 파일이 COM” 파일 앞에 있을 수 있습니다.
DCL에서는 잘못된 동사를 파일 지정 방법로 사용하고 DCL$PATH:.*”를 기본 파일 지정 방법로 사용하여 검색을 수행하므로 특정 파일을 찾는 방식으로 논리를 정의할 수 있습니다. 예를 들어, 논리 FOO가 FOO.EXE”가 되게 정의하고 DCL 프롬프트에 FOO”를 입력하면 FOO.COM은 호출하지 않고 FOO.EXE만 호출합니다.
주) 사용자가 권한이 있는 사용자이고 자신의 기본 장치와 디렉토리를 다른 사용자의 계정에 설정한 경우 SYS$DISK:[ ]”를 DCL$PATH 논리 이름 정의에 넣을 수 없습니다. 이렇게 하면 DCL에서 현재 디렉토리를 검색합니다. 따라서 검색 목록에서의 글자 오류나 잘못된 변환 배치 때문에 현재 디렉토리의 사용자 이미지가 발견되어 권한을 가지고 잘못 호출될 수 있습니다.
자동 외부 명령 제한
다음 제한 사항을 참고하십시오.
OpenVMS 운영 체제 6.2 이전 버전에서는 자동 외부 명령을 사용할 수 없습니다.
새 동사가 언제라도 DCL 명령 표에 추가될 수 있으므로 자동 외부 명령에서 작동되던 명령이 작동하지 않을 수도 있습니다.
자동 외부 명령 기능은 모든 경우에 작동하는 것은 아닙니다. 다음 보기에서는 동사의 처음 네 문자만 검색하는 DCL이 SHOW 동사와 일치하는 것을 찾으면(SHOWME의 처음 네 문자) SHOWME.COM 프로시저 대신 SHOW USERS 명령을 실행합니다. SHOWME를 DCL 기호를 정의하면 SHOWME 명령은 SHOWME.COM을 호출합니다.
$ DEFINE DCL$PATH SYS$SYSTEM,SYS$DISK:[]FOO
$ TYPE SHOWME.COM
$ SHOW SYMBOL P1
$ EXIT
$ SHOWME USERS
OpenVMS User Processes at MARCH 2, 1999 01:40 PM
Total number of users = 1, number of processes = 11

Username Interactive Subprocess Batch
RSMITH 9 2

TOC PREV NEXT INDEX