HP OpenVMS Systems Documentation

Content starts here

15 렉시칼 함수를 사용하여 정보 얻기 및 조작
렉시칼 함수는 명령행이나 명령 프로시저로 정보를 반환합니다. 반환된 정보는 사용자 프로세스나 시스템, 파일 및 장치, 논리 이름, 문자열 또는 데이터 유형에 대한 것일 수 있습니다. 렉시칼 함수는 접두사 F$에 의해 식별됩니다.
일반적으로 기호나 표현식을 사용하는 컨텍스트에서 렉시칼 함수를 사용할 수 있습니다. 명령 프로시저에서 렉시칼 함수를 사용하여 논리 이름을 변환하고 문자열 조작을 수행하며 프로시저의 현재 처리 모드를 확인할 수 있습니다. 많은 렉시칼 함수는 DCL 명령에서 가져올 수 있는 정보를 반환합니다.
이 장에는 다음 정보가 포함되어 있습니다.
렉시칼 함수 작동 방법
사용자 프로세스에 대한 정보 얻기
시스템에 대한 정보 얻기
파일 및 장치에 대한 정보 얻기
논리 이름 변환
문자열 조작
데이터 유형 조작
렉시칼 함수에 대한 자세한 내용은 온라인 도움말을 참조하십시오. 이 장에서 설명하는 명령에 대한 자세한 내용은 OpenVMS DCL Dictionary를 참조하십시오.
렉시칼 함수를 사용하는 이유
명령이 아닌 렉시칼 함수로부터 정보를 얻으면 명령 프로시저에서 이 정보를 좀 더 쉽게 조작할 수 있습니다. 예를 들어, F$ENVIRONMENT 함수나 SHOW DEFAULT 명령 중 하나를 사용하여 현재 기본 디렉토리의 이름을 얻을 수 있습니다. 그 차이는 다음과 같습니다.
F$ENVIRONMENT 함수를 사용하면 결과를 기호에 할당한 다음 나중에 프로시저에서 이 기호를 사용할 수 있습니다. 예를 들면 다음과 같습니다.
$ DIR_NAME = F$ENVIRONMENT("DEFAULT")
$ SET DEFAULT DISK4:[TEST]
.
.
.
$ SET DEFAULT 'DIR_NAME'
F$ENVIRONMENT 함수는 현재 기본 디스크와 디렉토리를 반환하며 이 값을 기호 DIR_NAME에 저장합니다. 프로시저 끝에서 DIR_NAME 기호를 사용하여 SET DEFAULT 명령으로 기본값을 복원할 수 있습니다.
F$ENVIRONMENT 함수 대신 SHOW DEFAULT 명령을 사용하여 현재 기본 디렉토리의 값을 얻는 경우 이 출력을 기호에 직접 할당할 수 없습니다. 따라서 프로시저는 다음과 같아집니다.
$! Redirect the output of the SHOW DEFAULT command to a file.
$ DEFINE/SUPERVISOR_MODE SYS$OUTPUT DISK4:[TEST]TEMPFILE.DAT
$ SHOW DEFAULT
$ DEASSIGN SYS$OUTPUT
$!
$ OPEN/READ DIR_FILE DISK4:[TEST]TEMPFILE.DAT ! Open the file.
$ READ DIR_FILE DIR_NAME, ! Read the file.
$ SET DEFAULT 'DIR_NAME' ! Reset the directory.
$ CLOSE DIR_FILE ! Close the file.
$ DELETE DISK4:[TEST]TEMPFILE.DAT;* ! Delete the file.
사용자 프로세스에 대한 정보 얻기
명령 프로시저가 지속되는 동안 프로세스 특성을 변경한 다음 복원하는 경우가 종종 있습니다. 이런 경우 다음 렉시칼 함수를 사용하여 사용자 프로세스에 대한 정보를 얻을 수 있습니다.
표 15-1
F$DIRECTORY
현재 기본 디렉토리 문자열을 반환합니다.
F$ENVIRONMENT
사용자 프로세스의 명령 환경에 대한 정보를 반환합니다.
F$GETJPI
시스템의 사용자 프로세스나 다른 프로세스에 대한 계정, 상태 및 식별 정보를 반환합니다.
F$MODE
프로세스가 실행되고 있는 모드를 보여 줍니다.
F$PRIVILEGE
사용자 프로세스가 지정된 권한을 가지고 있는지 표시합니다.
F$PROCESS
사용자 프로세스 이름을 반환합니다.
F$SETPRV
지정된 권한을 설정하고 F$SETPRV 함수를 사용하기 전에 지정된 권한이 이미 활성화되어 있는지 표시합니다.
F$USER
사용자 식별 코드(UIC)를 반환합니다.
F$VERIFY
확인 기능이 켜져 있는지 꺼져 있는지 표시합니다.

다음 표는 명령 프로시저에서 일반적으로 변경되는 프로세스 특성을 보여 줍니다. 그리고 이러한 특성을 저장하는 렉시칼 함수와 원래 설정을 복원하는 DCL 명령을 제시합니다.
표 15-2
특성
작업
명령 또는 렉시칼 함수
제어 문자
저장
F$ENVIRONMENT("CONTROL")
복원
SET CONTROL
DCL 프롬프트
저장
F$ENVIRONMENT("PROMPT")
복원
SET PROMPT
기본 보호
저장
F$ENVIRONMENT("PROTECTION")
복원
SET PROTECTION/DEFAULT
키 상태
저장
F$ENVIRONMENT("KEY_STATE")
복원
SET KEY
메시지 형식
저장
F$ENVIRONMENT("MESSAGE")
복원
SET MESSAGE
권한
저장
F$PRIVILEGE 또는 F$SETPRV
복원
F$SETPRV 또는 SET PROCESS/PRIVILEGES
확인
저장
F$VERIFY 또는 F$ENVIRONMENT
복원
F$VERIFY 또는 SET VERIFY

프로세스 특성을 저장하는 경우 원래 특성을 복원하기 전에 오류나 Ctrl/Y 인터럽트로 인해 프로시저가 종료하지 않도록 해야 합니다. 오류 및 Ctrl/Y 인터럽트 처리에 대한 자세한 내용은 13장을 참조하십시오.
확인 설정 변경
F$VERIFY 렉시칼 함수를 사용하여 명령 프로시저가 지속되는 동안 확인을 비활성화할 수 있습니다. 이렇게 하면 프로시저를 실행하는 동안 사용자가 프로시저 내용을 표시하지 못하게 할 수 있습니다.
두 가지 유형의 확인이 있습니다.
프로시저 확인
실행 중인 각 명령행을 표시합니다.
이미지 확인
처리 중인 각 데이터 행을 표시합니다.
기본적으로 SET [NO]VERIFY 명령과 F$VERIFY 함수는 두 가지 확인 유형을 모두 활성화하거나 비활성화합니다. 일반적으로 한 프로시저에서 프로시저 및 이미지 확인 설정은 같습니다. 즉, 양쪽 모두 활성화되어 있거나 양쪽 모두 비활성화되어 있습니다. 하지만 설정을 변경하기로 결정하면 각 확인 설정을 따로 저장하십시오.
다음 보기에서 기호 TEMP는 확인을 활성화 및 비활성화하는 데 사용합니다.
$ ! Enable verification
$ !
$ TEMP = F$VERIFY(1)
$ LOOP:
$ INQUIRE FILE "File name"$ IF FILE .EQS."" THEN EXIT
$ PRINT 'FILE'
$ GOTO LOOP
$ ! Disable verification
$ !
$ TEMP = F$VERIFY(0)
$ EXIT
다음 보기에서는 확인 설정이 저장됩니다.
$ ! Save each verification state.
$ ! Turn both states off.
$ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE")
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(0)
.
.
.
$ ! Restore original verification states.
$ SAVE_VERIFY_IMAGE = F$VERIFY(SAVE_VERIFY_PROCEDURE,-
SAVE_VERIFY_IMAGE)
F$ENVIRONMENT 함수가 현재 이미지 확인 설정을 반환하고 이 값을 기호 SAVE_VERIFY_IMAGE에 할당합니다. 그런 다음 F$VERIFY 함수가 현재 프로시저 확인 설정을 반환하고 이 값을 기호 SAVE_VERIFY_PROCEDURE에 할당합니다. F$VERIFY 함수는 이미지 및 프로시저 확인을 모두 비활성화합니다. F$VERIFY를 사용하여 확인을 비활성화하기 전에 F$ENVIRONMENT 함수를 사용하여 프로시저 확인 설정을 얻을 수 있습니다. 하지만 앞의 보기에서처럼 두 작업을 한 명령행에서 수행하려면 F$VERIFY를 사용하는 것이 더 간단합니다.
이 프로시저의 끝에서 F$VERIFY 함수는 기호 SAVE_VERIFY_PROCEDURE와 SAVE_VERIFY_IMAGE로 지정했던 원래 설정을 복원합니다.
주) time-stamp를 사용하고 있는 경우에는 확인이 활성화되어 있을 때만 적용된다는 사실을 기억해야 합니다. time-stamp 및 SET PREFIX 명령에 대한 자세한 내용은 OpenVMS DCL Dictionary 또는 DCL 도움말을 참조하십시오.
기본 파일 보호 변경
명령 프로시저 내에서 기본 파일 보호를 변경해야 하는 경우가 있습니다. 다음 명령 프로시저는 프로시저가 실행되는 동안 만든 파일과 연관된 기본 보호를 변경합니다.
프로시저에서는 종료하기 전에 원래의 기본 파일 보호를 복원합니다.
$ SAVE_PROT = F$ENVIRONMENT("PROTECTION")
$ SET PROTECTION = (SYSTEM:RWED, OWNER:RWED, GROUP, WORLD)/DEFAULT
.
.
.
$ SET PROTECTION=('SAVE_PROT')/DEFAULT
$ EXIT
F$ENVIRONMENT 함수는 SET PROTECTION 명령에 필요한 구문을 사용하여 기본 보호 코드를 반환한다는 사실을 유의하십시오. 따라서 SET PROTECTION 명령과 함께 기호 SAVE_PROT을 사용하여 원래의 기본 파일 보호를 복원할 수 있습니다.
시스템에 대한 정보 얻기
다음 렉시칼 함수를 사용하여 시스템에 대한 정보를 얻을 수 있습니다.
표 15-3
F$CONTEXT
F$PID 함수에 사용할 선택 조건을 지정합니다. F$CONTEXT 함수를 사용하면 F$PID 함수가 OpenVMS Cluster 시스템의 모든 노드에서 프로세스에 대한 정보를 얻을 수 있습니다.
F$CSID
OpenVMS Cluster 식별 번호를 반환하고 컨텍스트 기호를 업데이트하여 시스템의 OpenVMS Cluster 노드 목록에서 현재 위치를 가리키게 합니다.
F$GETQUI
대기열, 현재 해당 대기열에 있는 일괄 처리 작업 및 인쇄 작업, 양식 정의 그리고 시스템 작업 대기열 파일에 보관된 특성 정의에 대한 정보를 반환합니다.
F$GETSYI
로컬 시스템이나 OpenVMS Cluster 시스템의 노드(시스템이 OpenVMS Cluster의 일부인 경우)에 대한 정보를 반환합니다.
F$IDENTIFIER
증명서를 이름이 지정된 형식에서 숫자 형식으로 또는 숫자 형식에서 이름이 지정된 형식으로 변환합니다.
F$MESSAGE
상태 코드와 연결된 메시지 텍스트를 반환합니다.
F$PID
사용자가 검사할 수 있는 프로세스의 프로세스 증명서(PID)를 반환합니다.
F$TIME
현재 날짜와 시간을 반환합니다.

OpenVMS Cluster 노드 이름 확인
사용자의 시스템이 여러 개의 서로 다른 노드에 로그인할 수 있는 OpenVMS Cluster 환경의 일부인 경우에는 현재 사용하고 있는 노드를 나타내도록 DCL 프롬프트를 설정할 수 있습니다. 이 작업을 하려면 노드 이름을 확인할 수 있도록 로그인 명령 프로시저에 F$GETSYI 함수를 포함해야 합니다. 그런 다음 SET PROMPT 명령을 사용하여 해당 노드에 대해 고유한 프롬프트를 설정해야 합니다.
노드 이름의 일부만 프롬프트 문자열에 사용하려면 F$EXTRACT 함수를 사용하여 적절한 문자를 추출하십시오. 문자 추출에 대한 자세한 내용은 문자열의 일부 추출을 참조하십시오.
다음 보기에서 기호 NODE는 FF$GETSYI("NODENAME")로 정의되어 있으며 노드 이름은 프롬프트로 사용됩니다.
$ NODE = F$GETSYI("NODENAME")
$ SET PROMPT = "''NODE'$ "
.
.
.
대기열 정보 얻기
F$GETQUI 함수를 사용하여 일괄 처리 대기열 및 인쇄 대기열에 대한 여러 가지 유형의 정보를 얻을 수 있습니다. 대기열의 작업 및 파일에 대한 정보를 얻으려면 해당 작업에 대한 읽기 액세스 권한이나 SYSPRV 권한 또는 OPER 권한이 있어야 합니다.
다음 보기는 일괄 처리 대기열 VAX1_BATCH가 중단 상태에 있는지 확인하는 방법을 보여 줍니다. 반환된 값은 True이거나 False입니다. 대기열이 중단되지 않았으면 명령 프로시저가 작업을 대기열로 전송합니다.
$ QSTOPPED = F$GETQUI("DISPLAY_QUEUE", "QUEUE_STOPPED", "VAX1_BATCH")
$ IF QSTOPPED THEN GOTO NOBATCH
$ SUBMIT/QUEUE=VAX1_BATCH TEST.COM
$ NOBATCH:
.
.
.
프로세스 정보 얻기
F$PID 함수를 사용하면 검토할 수 있는 모든 프로세스의 프로세스 증명서(PID)를 얻을 수 있습니다. 다음 프로세스의 PID 번호를 얻을 수 있습니다.
WORLD 권한이 있는 경우 시스템의 모든 프로세스
GROUP 권한이 있는 경우 그룹의 모든 프로세스
GROUP 또는 WORLD 권한이 모두 없는 경우 사용자 프로세스
PID 번호를 얻었으면 F$GETJPI 함수를 사용하여 프로세스에 대한 특정 정보를 얻을 수 있습니다.
다음 보기는 검토할 수 있는 프로세스의 PID 번호를 얻고 표시하는 방법을 보여 줍니다.
$ ! Display the time when this procedure
$ ! begins executing.
$ WRITE SYS$OUTPUT F$TIME()
$ !
$ CONTEXT = ""$ START:
$ ! Obtain and display PID numbers until
$ ! F$PID returns a null string.
$ !
$ PID = F$PID(CONTEXT)
$ IF PID .EQS. "" THEN EXIT
$ WRITE SYS$OUTPUT "Pid --- ''PID'"$ GOTO START
시스템에서는 기호 CONTEXT를 사용하여 PID 번호의 시스템 목록 안에 포인터를 유지합니다. 루프를 통과할 때마다 시스템은 포인터를 변경하여 목록에서 다음 PID 번호를 찾습니다. PID 번호가 모두 표시되면 프로시저가 종료됩니다.
다음 보기에서 프로시저는 각 프로세스의 PID 번호와 UIC를 표시합니다.
$ CONTEXT = ""$ START:
$ ! Obtain and display PID numbers and UICs.
$ !
$ PID = F$PID(CONTEXT)
$ IF PID .EQS. "" THEN EXIT
$ UIC = F$GETJPI(PID,"UIC")
$ WRITE SYS$OUTPUT "Pid --- ''PID' Uic--- ''UIC' "$ GOTO START
다음과 같이 WRITE 명령 내에 F$GETJPI 함수를 포함하여 이 명령 프로시저를 짧게 만들 수 있습니다.
$ CONTEXT = ""$ START:
$ PID = F$PID(CONTEXT)
$ IF PID .EQS. "" THEN EXIT
$ WRITE SYS$OUTPUT "Pid --- ''PID' Uic --- ''F$GETJPI(PID,"UIC")'"$ GOTO START
F$CONTEXT 렉시칼 함수
OpenVMS Cluster 시스템의 노드로부터 프로세스에 대한 정보를 얻으려면 F$CONTEXT 함수를 사용하십시오.
다음 보기에서는 선택 조건을 설정하기 위해 F$CONTEXT가 세 번 호출됩니다.
$! Establish an error and Ctrl/Y handler.
$!
$ ON ERROR THEN GOTO error
$ ON CONTROL_Y THEN GOTO error
$!
$ ctx = ""
$ temp = F$CONTEXT ("PROCESS", ctx, "NODENAME", "*","EQL") [1]
$ temp = F$CONTEXT ("PROCESS", ctx, "USERNAME", "M*,SYSTEM","EQL") [2]
$ temp = F$CONTEXT ("PROCESS", ctx, "CURPRIV", "SYSPRV,OPER", "ALL") [3]
$!
$!Loop over all processes that meet the selection criteria.
$!Print the PID number and the name of the image for each process.
$!
$loop: [4]
$ pid = F$PID(ctx)
$ IF pid .EQS. ""$ THEN
$ GOTO endloop
$ ELSE
$ image = F$GETJPI(pid,"IMAGNAME") [5]
$ SHOW SYMBOL pid
$ WRITE SYS$OUTPUT image [6]
$ GOTO loop
$ ENDIF
$!The loop over the processes has ended.
$!
$endloop:
$!
$ EXIT
$!
$!Error handler. Clean up the context's memory with
$!the CANCEL selection item keyword.
$!
$error:
$ IF F$TYPE(ctx) .eqs. "PROCESS_CONTEXT" THEN - [7]
-$ temp = F$CONTEXT ("PROCESS", ctx, "CANCEL") [8]
$!
$ EXIT
보기를 검토할 때 다음 내용에 유의하십시오.
[1] 첫 번째 호출에서는 OpenVMS Cluster 시스템의 모든 노드를 검색하도록 요청합니다.
[2] 두 번째 호출에서는 사용자 이름이 M으로 시작하거나 SYSTEM인 프로세스만 처리할 것을 요청합니다.
[3] 세 번째 호출은 현재 권한에 SYSPRV(시스템 권한)와 OPER(운영자)를 모두 포함하고 다른 권한도 가질 수 있는 프로세스만 선택하도록 제한합니다.
[4] 레이블 loop”과 endloop 사이의 명령행은 계속 F$PID를 호출하여 F$CONTEXT 호출에 설정된 조건에 맞는 프로세스를 얻습니다.
[5] 각 PID 번호를 검색한 후 프로세스에서 실행 중인 이미지 이름을 반환하기 위해 F$GETJPI가 호출됩니다.
[6] 마지막으로 프로시저에서 이미지 이름을 표시합니다.
[7] 오류나 Ctrl/Y 작업이 발생하는 경우 컨트롤은 error로 전달되고 필요한 경우 컨텍스트가 닫힙니다.
[8] PROCESS_CONTEXT 기호 유형에 대한 검사에 유의하십시오. 기호가 이 유형이면 선택 조건은 F$CONTEXT에 대한 호출에 의해 취소되어야 합니다. 기호가 PROCESS_CONTEXT 유형이 아닌 경우에는 선택 조건이 F$CONTEXT에 아직 설정되지 않았거나, 또는 오류가 발생하거나 프로세스 목록 끝에 도달할 때까지 기호가 사용된 것입니다.
파일 및 장치에 대한 정보 얻기
다음 렉시칼 함수를 사용하여 파일 및 장치에 대한 정보를 얻을 수 있습니다.
표 15-4
F$DEVICE
지정한 선택 조건을 만족하는 시스템의 모든 장치 이름을 반환합니다.
F$FILE_ATTRIBUTES
파일 속성에 대한 정보를 반환합니다.
F$GETDVI
지정된 장치에 대한 정보를 반환합니다.
F$PARSE
파일 지정 방법을 구문 분석하고 요청한 필드를 반환합니다.
F$SEARCH
디렉토리에서 파일을 검색합니다.

장치 검색
시스템 서비스 $GETDVI를 사용하여 특정 장치에 대한 정보를 얻으려면 장치 이름을 서비스에 제공해야 합니다. 장치 이름을 모르는 경우 렉시칼 함수 F$DEVICE를 사용하여 장치 이름을 찾을 수 있습니다.
F$DEVICE 함수를 사용하면 장치 이름, 장치 클래스 또는 장치 유형으로 와일드카드 검색을 할 수 있습니다. 장치 유형으로 검색하는 경우 장치 클래스도 지정해야 합니다.
명령 프로시저의 루프에 F$DEVICE 함수를 사용하여 지정한 선택 조건과 일치하는 장치 이름을 반환할 수 있습니다. F$DEVICE 함수가 실행될 때마다 선택 조건에 일치하는 시스템에서 그 다음 장치를 반환합니다. 특정 순서로 장치가 반환되는 것은 아닙니다. 마지막 장치 이름이 반환된 F$DEVICE 함수를 다시 호출하면 null 문자열이 반환됩니다.
다음 명령 프로시저는 번호가 0인 장치에서 모든 RA60의 장치 이름을 표시합니다.
$ START:
$ DEVICE_NAME = F$DEVICE("*0:","DISK","RA60")
$ IF DEVICE_NAME .EQS. "" THEN EXIT
$ SHOW SYMBOL DEVICE_NAME
$ GOTO START
디렉토리에서 파일 검색
파일을 처리하기 전에 명령 프로시저는 파일이 존재하는지 테스트하기 위해 F$SEARCH 함수를 사용해야 합니다. 예를 들어, 다음 명령 프로시저는 F$PARSE를 사용하여 장치 및 디렉토리 문자열을 STATS.DAT 파일에 적용합니다. 그런 다음 프로시저에서 F$SEARCH 함수를 사용하여 STATS.DAT이 DISK3:[JONES.WORK]에 있는지 확인합니다. 파일이 있으면 명령 프로시저에서 파일을 처리합니다. 파일이 없으면 명령 프로시저는 다른 입력 파일을 입력하라는 메시지를 표시합니다.
$ FILE = F$PARSE("STATS.DAT","DISK3:[JONES.WORK]",,,"SYNTAX_ONLY")
$ IF F$SEARCH(FILE) .EQS. "" THEN GOTO GET_FILE
$ PROCESS_FILE:
.
.
.
$ GET_FILE:
$ INQUIRE FILE "File name"$ GOTO PROCESS_FILE
파일이 있는지 확인한 다음 프로시저는 F$PARSE 또는 F$FILE_ATTRIBUTES 함수를 사용하여 파일에 대한 추가 정보를 얻을 수 있습니다. 예를 들면 다음과 같습니다.
$ IF F$SEARCH("STATS.DAT") .EQS. "" THEN GOTO GET_FILE
$ PROCESS_FILE:
$ NAME = F$PARSE("STATS.DAT",, "NAME")
.
.
.
$ GET_FILE:
$ INQUIRE FILE "File name"$ GOTO PROCESS_FILE
파일의 이전 버전 삭제
명령 프로시저가 종료된 후에 프로시저에 필요 없는 파일을 만드는 경우에는 해당 프로시저를 끝내기 전에 이 파일을 삭제하거나 지워야 합니다. 가장 최신 버전을 제외한 모든 버전을 삭제하려면 PURGE 명령을 사용하십시오. 파일의 특정 버전을 삭제하려면 DELETE 명령에 버전 번호를 사용하고, 파일의 모든 버전을 삭제하려면 DELETE 명령과 함께 버전 필드에 와일드카드 문자를 사용하십시오.
명령 프로시저 내에서 DELETE 명령을 사용할 때 오류 메시지를 피하려면 파일을 삭제하기 전에 F$SEARCH 함수를 사용하여 파일이 있는지 확인하십시오. 예를 들어, 특정 모듈이 실행되는 경우에만 TEMP.DAT라는 파일을 만드는 명령 프로시저를 작성할 수 있습니다. 다음 명령행은 TEMP.DAT가 존재하는 경우에만 DELETE 명령을 실행합니다.
$ IF F$SEARCH("TEMP.DAT") .NES. "" THEN DELETE TEMP.DAT;*
논리 이름 변환
다음 렉시칼 함수를 사용하여 논리 이름을 변환할 수 있습니다.
표 15-5
F$LOGICAL
논리 이름의 등가 문자열을 반환합니다.
F$TRNLNM
논리 이름의 등가 문자열이나 요청된 속성 중 하나를 반환합니다.

주) F$TRNLNM 함수는 OpenVMS 운영 체제의 이전 버전에서 사용되었던 F$LOGICAL 함수보다 우선합니다. 명령 프로시저에서 현재 시스템 기술을 사용하여 논리 이름을 처리하게 하려면 F$LOGICAL 대신 F$TRNLNM을 사용해야 합니다.
일부 상황에서는 명령 프로시저에서 기호 대신 논리 이름을 변수로 사용해야 하는 경우가 있습니다. 보통 프로그램들은 DCL 기호에 액세스하는 것보다 더 쉽게 논리 이름에 액세스할 수 있습니다. 그러므로 명령 프로시저에서 실행하는 프로그램에 정보를 전달하려면 기호를 사용하여 정보를 얻은 다음 DEFINE이나 ASSIGN 명령을 사용하여 기호 값을 논리 이름과 일치시킬 수 있습니다.
F$TRNLNM 함수를 사용하여 논리 이름의 값을 확인한 다음 이 값을 기호에 할당할 수도 있습니다.
다음 보기는 NAMES라는 논리 이름이 정의되어 있는지 테스트합니다. 논리 이름이 정의되어 있으면 프로시저에서 PAYROLL.EXE를 실행합니다. 논리 이름이 정의되어 있지 않으면 기호 FILE의 값을 얻은 다음 이 값을 사용하여 논리 이름 NAMES를 만듭니다. PAYROLL.EXE는 논리 이름 NAMES를 사용하여 직원 이름 파일을 참조합니다.
$ ! Make sure that NAMES is defined.
$ IF F$TRNLNM("NAMES") .NES. "" THEN GOTO ALL_SET
$ INQUIRE FILE "File with employee names"$ DEFINE NAMES 'FILE'
$ !
$ ! Run PAYROLL, using the file indicated by NAMES.
$ ALL_SET:
$ RUN PAYROLL
.
.
.
이 명령 프로시저는 프로그램 PAYROLL에 사용되는 논리 이름을 정의합니다.
$ DEFINE NAMES DISK4:[JONES]EMPLOYEE_NAMES.DAT
$ RUN PAYROLL
.
.
.
$ WRITE SYS$OUTPUT "Finished processing ",F$TRNLNM("NAMES")
프로시저 끝에서 WRITE 명령은 파일이 처리되었는지 나타내는 메시지를 표시합니다.
문자열 조작
다음 렉시칼 함수를 사용하여 문자열을 조작할 수 있습니다.
표 15-6
F$CVTIME
시간 문자열에 대한 정보를 반환합니다.
F$EDIT
문자열을 편집합니다.
F$ELEMENT
요소가 구분 기호로 구분되어 있는 문자열에서 요소를 추출합니다.
F$EXTRACT
문자열의 섹션을 추출합니다.
F$FAO
출력 문자열 형식을 지정합니다.
F$LENGTH
문자열의 길이를 결정합니다.
F$LOCATE
문자열 내에서 문자나 부분 문자열을 찾아 오프셋을 반환합니다.

문자열이나 문자가 있는지 확인
문자열을 검토하는 일반적인 이유는 문자열 내에 문자 또는 부분 문자열이 있는지 확인하기 위한 것입니다. 확인하려면 F$LENGTH 및 F$LOCATE 함수를 사용하십시오. F$LOCATE 함수에서 반환하는 값이 F$LENGTH 함수에서 반환하는 값과 같으면 찾는 문자가 없는 것입니다.
다음 프로시저에는 버전 번호가 포함된 파일 이름이 필요합니다. 버전 번호가 있는지 확인하기 위해 프로시저에서는 파일 이름의 버전 번호 앞에 있는 세미콜론(;)이 사용자가 입력한 파일 이름에 포함되어 있는지 테스트합니다.
$ INQUIRE FILE "Enter file (include version number)"
$ IF F$LOCATE(";", FILE) .EQ. F$LENGTH(FILE) THEN -
GOTO NO_VERSION
.
.
.
F$LOCATE 함수는 세미콜론의 오프셋을 반환합니다. 오프셋은 0에서 시작합니다. 따라서 세미콜론이 문자열의 첫 번째 문자이면 F$LOCATE 함수는 정수 0을 반환합니다. 문자열 내에 세미콜론이 없으면 F$LOCATE 함수는 문자열에서 마지막 문자의 오프셋보다 하나 큰 오프셋을 반환합니다. 이 값은 숫자 1로 시작하는 문자열 길이를 측정하는 F$LENGTH에서 반환하는 길이와 같습니다.
문자열의 일부 추출
문자열의 일부를 추출하려면 F$EXTRACT 함수나 F$ELEMENT 함수 중 하나를 사용하십시오. 정의된 오프셋에서 시작하는 부분 문자열을 추출하려면 F$EXTRACT 함수를 사용하십시오. 두 개의 구분 기호 사이에 있는 문자열의 일부를 추출하려면 F$ELEMENT 함수를 사용하십시오. 이러한 함수 중 하나를 사용하려면 구문 분석할 문자열의 일반 형식을 알아야 합니다. 파일 지정 방법이나 시간 문자열을 구문 분석하는 데는 F$EXTRACT나 F$ELEMENT를 사용할 필요가 없습니다. 대신 F$PARSE나 F$CVTIME을 사용하여 파일 지정 방법이나 시간 문자열에서 필요한 부분을 추출하십시오.
그리고 그룹 이름을 추출할 때 그룹 이름의 길이도 같이 확인할 수 있습니다.
문자열의 다른 부분을 구분하는 구분 기호가 문자열에 있으면 F$ELEMENT 함수를 사용하여 원하는 부분을 추출하십시오. F$ELEMENT를 사용하면 쉼표 사이의 문자열 부분을 추출하므로 다양한 액세스 유형을 얻을 수 있습니다. 시스템 액세스를 확인하려면 첫 번째 요소를 가져오고, 소유자 액세스를 확인하려면 두 번째 요소를 가져오는 식으로 처리됩니다. F$ELEMENT 함수를 사용할 때 요소 숫자는 0에서 시작합니다. 즉, 네 번째 요소를 지정하려면 정수 3을 사용해야 합니다.
다음 명령 프로시저는 F$EXTRACT 함수를 사용하여 UIC의 그룹 부분을 추출합니다. 이렇게 하면 프로시저에서 사용자의 UIC 그룹에 따라 다른 명령 집합을 실행할 수 있습니다.
$ UIC = F$USER()
$ GROUP_LEN = F$LOCATE(",",UIC) - 1
$ GROUP = F$EXTRACT(1,GROUP_LEN, UIC)
$ GOTO 'GROUP'_SECTION
.
.
.
$ WRITERS_SECTION:
.
.
.
$ MANAGERS_SECTION:
.
.
.
먼저 프로시저에서 F$USER 함수를 사용하여 UIC를 확인합니다. 그런 다음 프로시저는 F$LOCATE 함수로 쉼표의 오프셋을 찾아 그룹 이름 길이를 확인합니다. 쉼표는 UIC의 사용자 부분에서 그룹을 분리합니다. 왼쪽 대괄호와 쉼표 사이의 모든 내용이 그룹 이름 부분입니다. 예를 들어, UIC [WRITERS,SMITH]에서 그룹 이름은 WRITERS입니다.
길이를 확인한 다음 프로시저에서는 F$EXTRACT 함수를 사용하여 그룹 이름을 추출합니다. 오프셋 1로 시작하는 이름은 쉼표 앞의 문자에서 끝납니다. 마지막으로 실행을 적절한 레이블로 지시합니다.
다음 보기는 그룹 이름을 추출하면서 동시에 그룹 이름 길이를 확인하는 방법을 보여 줍니다.
$ UIC = F$USER()
$ GROUP = F$EXTRACT(1, F$LOCATE(",",UIC) - 1, UIC)
$ GOTO 'GROUP'_SECTION
다음 보기는 보호 코드의 각 액세스 유형을 쉼표로 구분하는 방법을 보여 줍니다.
$ PROT = F$ENVIRONMENT("PROTECTION")
$ SHOW SYMBOL PROT
PROT = "SYSTEM=RWED, OWNER=RWED, GROUP=RE, WORLD"
이 보기의 명령은 기본 보호 코드에서 world 액세스 부분(네 번째 요소)을 추출합니다.
$ PROT = F$ENVIRONMENT("PROTECTION")
$ WORLD_PROT = F$ELEMENT(3,",",PROT)
.
.
.
F$ELEMENT 함수는 세 번째 쉼표와 문자열 끝 사이에 있는 모든 내용을 반환합니다. 따라서 기본 보호에서 world 사용자에게 읽기 액세스를 허용한 경우에는 문자열 "WORLD=R"이 반환됩니다.
world 액세스 문자열을 얻은 후에 문자열 내용을 검토해야 할 수 있습니다. 예를 들면 다음과 같습니다.
$ PROT = F$ENVIRONMENT("PROTECTION")
$ WORLD_PROT = F$ELEMENT(3,",",PROT)
$ IF F$LOCATE("=", WORLD_PROT) .EQ. F$LENGTH(WORLD_PROT) -
THEN GOTO NO_WORLD_ACCESS
.
.
.
출력 문자열 서식 지정
WRITE 명령을 사용하여 문자열을 레코드에 기록할 수 있습니다. 레코드 열을 줄 맞춤하려면 F$FAO 함수를 사용하여 레코드 필드를 정의하고 이 필드에 프로세스 이름과 사용자 이름을 둘 수 있습니다. F$FAO 함수를 사용할 때 제어 문자열을 사용하여 레코드에 필드를 정의한 다음 이 필드에 값이 놓이도록 지정하십시오.
레코드에서 필드의 서식을 지정하는 다른 방법은 문자열 오버레이를 사용하는 것입니다. 하지만 F$FAO 함수의 기능이 문자열 오버레이보다 더 강력합니다. F$FAO 함수를 사용하면 좀 더 광범위한 출력 작업을 수행할 수 있습니다.
다음 보기에 표시된 명령 프로시저는 WRITE 명령을 사용하여 시스템의 프로세스에 대한 프로세스 이름과 PID 번호를 표시합니다.
$ ! Initialize context symbol to get PID numbers
$ CONTEXT = ""$ ! Write headings
$ WRITE SYS$OUTPUT "Process Name PID"$ !
$ GET_PID:
$ PID = F$PID(CONTEXT)
$ IF PID .EQS. "" THEN EXIT
$ WRITE SYS$OUTPUT F$GETJPI(PID,"PRCNAM")," ", F$GETJPI(PID,"PID")
$ GOTO GET_PID
WRITE 명령의 출력은 프로세스 이름과 사용자 이름 사이에 5개의 공백이 삽입되지만 열의 줄을 맞추지는 않습니다.
Process Name PID
MARCHESAND 2CA0049C
TRACTMEN 2CA0043A
FALLON 2CA0043C
ODONNELL 2CA00453
PERRIN 2CA004DE
CHAMPIONS 2CA004E3
이 보기의 명령 프로시저는 F$FAO 함수를 사용하여 16자 필드와 12자 필드를 정의합니다. F$FAO 함수는 첫 번째 필드에 프로세스 이름을 두고 공백을 하나 둔 다음 두 번째 필드에 PID 번호를 둡니다.
$ ! Initialize context symbol to get PID numbers
$ CONTEXT = ""$ ! Write headings
$ WRITE SYS$OUTPUT "Process Name PID"$ !
$ GET_PID:
$ PID = F$PID(CONTEXT)
$ IF PID .EQS. "" THEN EXIT
$ LINE = F$FAO("!16AS !12AS", F$GETJPI(PID,"PRCNAM"), F$GETJPI(PID,"PID") )
$ WRITE SYS$OUTPUT LINE
$ GOTO GET_PID
이제 프로시저를 실행하면 열이 정렬됩니다.
Process Name PID
MARCHESAND 2CA0049C
TRACTMEN 2CA0043A
FALLON 2CA0043C
ODONNELL 2CA00453
PERRIN 2CA004DE
CHAMPIONS 2CA004E3
다음 보기는 오버레이를 사용하여 기호 RECORD의 첫 번째 16자(오프셋 0에서 시작)에 프로세스 이름을 둡니다. 그 다음 12자(오프셋 17에서 시작)에 PID 번호를 둡니다.
$ ! Initialize context symbol to get PID numbers
$ CONTEXT = ""$ ! Write headings
$ WRITE SYS$OUTPUT "Process Name PID"$ !
$ GET_PID:
$ PID = F$PID(CONTEXT)
$ IF PID .EQS. "" THEN EXIT
$ RECORD[0,16]:= 'F$GETJPI(PID,"PRCNAM")'
$ RECORD[17,12]:= 'F$GETJPI(PID,"PID")'
$ WRITE SYS$OUTPUT RECORD
$ GOTO GET_PID
다음 프로시저는 F$FAO 함수를 사용하여 만든 열에 같은 유형의 서식을 지정합니다.
Process Name PID
MARCHESAND 2CA0049C
TRACTMEN 2CA0043A
FALLON 2CA0043C
ODONNELL 2CA00453
PERRIN 2CA004DE
CHAMPIONS 2CA004E3
데이터 유형 조작
다음 렉시칼 함수를 사용하여 데이터를 문자열에서 정수로 또는 정수에서 문자열로 변환할 수 있습니다.
표 15-7
F$CVSI
문자열에서 비트 필드를 추출하여 결과를 정수(부호 있는 값)로 변환합니다.
F$CVUI
문자열에서 비트 필드를 추출하여 결과를 정수(부호 없는 값)로 변환합니다.
F$INTEGER
문자열 표현식을 정수로 변환합니다.
F$STRING
정수 표현식을 문자열로 변환합니다.
F$TYPE
기호의 데이터 유형을 결정합니다.

데이터 유형 변환
정수와 문자열 간을 변환하려면 F$INTEGER 및 F$STRING 함수를 사용하십시오. 예를 들어, 다음 명령 프로시저는 데이터 유형을 변환합니다. 문자열을 입력하면 명령 프로시저는 등가 정수를 보여 줍니다. 정수를 입력하면 명령 프로시저는 등가 문자열을 보여 줍니다. GOTO 문에서 레이블 이름의 서식을 지정하기 위해 F$TYPE 함수를 사용하는 방법에 유의하십시오. F$TYPE은 기호의 데이터 유형에 따라 “STRING”이나 “INTEGER”를 반환합니다.
$ IF P1 .EQS. "" THEN INQUIRE P1 "Value to be converted"$ GOTO CONVERT_'F$TYPE(P1)'
$
$ CONVERT_STRING:
$ WRITE SYS$OUTPUT "The string ''P1' is converted to ''F$INTEGER(P1)'"$ EXIT
$
$ CONVERT_INTEGER:
$ WRITE SYS$OUTPUT "The integer ''P1' is converted to ''F$STRING(P1)'"$ EXIT
표현식 평가
INQUIRE 및 READ 같은 일부 명령은 문자열 데이터만 받아들입니다. 정수 표현식으로 평가할 데이터를 얻는 데 이러한 명령을 사용하는 경우에는 F$INTEGER 함수를 사용하여 데이터를 변환하고 값을 구해야 합니다.
기호 EXP를 F$INTEGER 함수의 인수로 사용할 때 기호 EXP 주위에 어포스트로피(' ' )를 삽입해야 합니다. 이렇게 하면 기호 대체의 첫 단계 동안 DCL이 EXP 값을 대체합니다.
다음 보기에서 F$INTEGER 함수는 정수 표현식의 값을 구하는 데 사용됩니다.
$ INQUIRE EXP "Enter integer expression"
$ RES = F$INTEGER('EXP')
$ WRITE SYS$OUTPUT "Result is",RES
이 명령 프로시저의 출력은 다음과 같을 것입니다.
Enter integer expression: 9 + 7
Result is 16
“9 + 7” 값이 대체되었습니다. F$INTEGER 함수가 인수 “9 + 7”을 처리하면 표현식을 계산하여 올바른 결과를 반환합니다.
기호의 존재 여부 확인
기호가 존재하는지 확인하려면 F$TYPE 함수를 사용하십시오. F$TYPE 함수는 기호가 정의되어 있지 않는 경우 null 문자열을 반환합니다. 예를 들면 다음과 같습니다.
.
.
.
$ IF F$TYPE(TEMP) .EQS. "" THEN TEMP = "YES"
$ IF TEMP .EQS. "YES" THEN GOTO TEMP_SEC
.
.
.
이 프로시저에서는 기호 TEMP가 이전에 정의되어 있었는지 테스트합니다. 정의되어 있었다면 TEMP의 현재 값이 유지됩니다. TEMP가 정의되어 있지 않으면 IF 문은 “YES” 값을 TEMP에 할당합니다.

TOC PREV NEXT INDEX