이 시리즈의 첫 번째 기사에서는 아주 작은 한 줄짜리 Bash 스크립트를 처음으로 만들고 셸 스크립트를 만드는 이유를 살펴보았습니다. 두 번째 기사에서는 다른 Bash 프로그램의 시작점이 될 수 있는 상당히 간단한 템플릿을 만들고 테스트를 시작했습니다. 세 번째 기사에서는 간단한 도움말 기능을 만들고 사용했으며 기능 사용 및 -h와 같은 명령줄 옵션을 처리하는 방법에 대해 배웠습니다. .
이 시리즈의 네 번째이자 마지막 기사에서는 변수 및 초기화에 대해 설명하고 프로그램이 적절한 조건에서 실행되는지 확인하기 위해 약간의 온전성 테스트를 수행하는 방법을 설명합니다. 이 시리즈의 목적은 미래의 Bash 프로그래밍 프로젝트를 위한 템플릿에 사용될 작업 코드를 빌드하는 것입니다. 이 아이디어는 템플릿에서 이미 사용할 수 있는 공통 요소를 사용하여 새로운 프로그래밍 프로젝트를 쉽게 시작할 수 있도록 하는 것입니다.
변수
모든 프로그래밍 언어와 마찬가지로 Bash 셸은 변수를 처리할 수 있습니다. 변수는 일종의 값을 포함하는 메모리의 특정 위치를 나타내는 기호 이름입니다. 변수의 값은 변경 가능합니다. 즉, 변수입니다. 변수 사용에 익숙하지 않다면 제 기사 Bash로 프로그래밍하는 방법:구문 및 도구를 읽어보세요. 더 진행하기 전에.
완료? 엄청난! 이제 변수를 사용할 때의 몇 가지 모범 사례를 살펴보겠습니다.
나는 항상 내 스크립트에 사용되는 모든 변수에 대해 초기 값을 설정합니다. 옵션을 처리하기 전에 기본 프로그램 본문의 첫 번째 부분으로 절차 직후 템플릿 스크립트에서 이를 찾을 수 있습니다. 각 변수를 적절한 값으로 초기화하면 비교 또는 수학 연산에서 초기화되지 않은 변수에서 발생할 수 있는 오류를 방지할 수 있습니다. 이 변수 목록을 한 곳에 배치하면 스크립트에 있어야 하는 모든 변수와 초기 값을 볼 수 있습니다.
작은 스크립트에는 $option이라는 단일 변수만 있습니다. , 지금까지. 그림과 같이 다음 줄을 삽입하여 설정합니다.
################################################################################
################################################################################
# Main program #
################################################################################
################################################################################
# Initialize variables
option=""
################################################################################
# Process the input options. Add options as needed. #
################################################################################
모든 것이 제대로 작동하고 이 변경으로 인해 손상된 것이 없는지 테스트하십시오.
상수
상수도 변수입니다. 적어도 그래야 합니다. 하드 코딩된 값 대신 명령줄 인터페이스(CLI) 프로그램에서 가능하면 변수를 사용합니다. 특정 값(디렉토리 이름, 파일 이름 또는 텍스트 문자열 등)을 한 번만 사용할 것이라고 생각하더라도 변수를 생성하고 하드 코딩된 이름을 배치할 위치에 사용하십시오.
예를 들어 프로그램 본문의 일부로 인쇄된 메시지는 echo "Hello world!" 문자열 리터럴입니다. . 그것을 변수로 변경하십시오. 먼저 변수 초기화 섹션에 다음 문을 추가합니다.
Msg="Hello world!"
이제 프로그램의 마지막 줄을 다음에서 변경합니다.
echo "Hello world!"
받는 사람:
echo "$Msg"
결과를 테스트하십시오.
온전성 검사
온전성 검사는 다음과 같이 프로그램이 올바르게 작동하기 위해 참이어야 하는 조건에 대한 테스트일 뿐입니다. 프로그램은 루트 사용자로 실행되어야 하거나 해당 배포판의 특정 배포 및 릴리스에서 실행되어야 합니다. 루트에 대한 수표 추가 간단한 프로그램 템플릿에서 실행 중인 사용자로
프로그램을 실행하는 사용자로 프로그램이 실행되기 때문에 루트 사용자가 프로그램을 실행하고 있는지 테스트하는 것은 쉽습니다.
아이디 명령을 사용하여 프로그램이 실행 중인 숫자 사용자 ID(UID)를 확인할 수 있습니다. 옵션 없이 사용할 때 몇 가지 정보를 제공합니다.
[student@testvm1 ~]$ id
uid=1001(student) gid=1001(student) groups=1001(student),5000(dev)
-u 사용 옵션은 Bash 프로그램에서 쉽게 사용할 수 있는 사용자의 UID만 반환합니다.
[student@testvm1 ~]$ id -u
1001
[student@testvm1 ~]$
프로그램에 다음 기능을 추가합니다. 도움말 절차 후에 추가했지만 절차 섹션의 아무 곳에나 배치할 수 있습니다. 논리는 UID가 항상 루트 사용자의 UID인 0이 아니면 프로그램이 종료된다는 것입니다.
################################################################################
# Check for root. #
################################################################################
CheckRoot()
{
if [ `id -u` != 0 ]
then
echo "ERROR: You must be root user to run this program"
exit
fi
}
이제 CheckRoot에 대한 호출을 추가합니다. 변수 초기화 직전의 절차. 먼저 학생 사용자로 프로그램을 실행하여 테스트합니다.
[student@testvm1 ~]$ ./hello
ERROR: You must be root user to run this program
[student@testvm1 ~]$
그런 다음 루트 사용자로:
[root@testvm1 student]# ./hello
Hello world!
[root@testvm1 student]#
이 특정 온전성 테스트가 항상 필요한 것은 아니므로 CheckRoot 호출을 주석 처리하십시오. 그러나 모든 코드는 템플릿에 그대로 두십시오. 이런 식으로 향후 프로그램에서 해당 코드를 사용하기 위해 해야 할 일은 호출의 주석을 제거하는 것입니다.
코드
위에서 설명한 대로 변경한 후 코드는 다음과 같아야 합니다.
#!/usr/bin/bash
################################################################################
# scriptTemplate #
# #
# Use this template as the beginning of a new program. Place a short #
# description of the script here. #
# #
# Change History #
# 11/11/2019 David Both Original code. This is a template for creating #
# new Bash shell scripts. #
# Add new history entries as needed. #
# #
# #
################################################################################
################################################################################
################################################################################
# #
# Copyright (C) 2007, 2019 David Both #
# [email protected] #
# #
# This program is free software; you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation; either version 2 of the License, or #
# (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program; if not, write to the Free Software #
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #
# #
################################################################################
################################################################################
################################################################################
################################################################################
# Help #
################################################################################
Help()
{
# Display Help
echo "Add description of the script functions here."
echo
echo "Syntax: scriptTemplate [-g|h|v|V]"
echo "options:"
echo "g Print the GPL license notification."
echo "h Print this Help."
echo "v Verbose mode."
echo "V Print software version and exit."
echo
}
################################################################################
# Check for root. #
################################################################################
CheckRoot()
{
# If we are not running as root we exit the program
if [ `id -u` != 0 ]
then
echo "ERROR: You must be root user to run this program"
exit
fi
}
################################################################################
################################################################################
# Main program #
################################################################################
################################################################################
################################################################################
# Sanity checks #
################################################################################
# Are we rnning as root?
# CheckRoot
# Initialize variables
option=""
Msg="Hello world!"
################################################################################
# Process the input options. Add options as needed. #
################################################################################
# Get the options
while getopts ":h" option; do
case $option in
h) # display Help
Help
exit;;
\?) # incorrect option
echo "Error: Invalid option"
exit;;
esac
done
echo "$Msg"
마지막 연습
코드의 도움말 기능이 코드에 없는 기능을 참조한다는 사실을 눈치채셨을 것입니다. 마지막 연습으로 이러한 기능을 생성한 코드 템플릿에 추가하는 방법을 알아보세요.
요약
이 기사에서는 프로그램이 루트로 실행 중인지 여부에 대한 온전성 테스트를 수행하는 몇 가지 함수를 만들었습니다. 귀하의 프로그램이 점점 더 복잡해지고 있으므로 테스트가 더욱 중요해지고 있으며 완료하려면 더 많은 테스트 경로가 필요합니다.
이 시리즈는 아주 최소한의 Bash 프로그램과 한 번에 조금씩 스크립트를 작성하는 방법을 살펴보았습니다. 그 결과 더 유용한 다른 Bash 스크립트의 시작점이 될 수 있고 새 스크립트를 쉽게 시작할 수 있게 해주는 유용한 요소가 포함된 간단한 템플릿이 생성됩니다.
지금쯤이면 다음과 같은 생각이 들 것입니다. 컴파일된 프로그램이 필요하고 매우 중요한 요구 사항을 충족합니다. 그러나 시스템 관리자에게는 항상 더 나은 방법이 있습니다. 작업의 자동화 요구 사항을 충족하려면 항상 셸 스크립트를 사용하십시오. 쉘 스크립트가 열려 있습니다. 그들의 내용과 목적을 알 수 있습니다. 다양한 요구 사항을 충족하도록 쉽게 수정할 수 있습니다. 쉘 스크립트로 수행할 수 없는 내 시스템 관리자 역할에서 수행해야 하는 작업을 찾지 못했습니다.
이 시리즈에서 지금까지 만든 것은 시작에 불과합니다. Bash 프로그램을 더 많이 작성할수록 자주 사용하고 프로그램 템플릿에 포함되어야 하는 더 많은 코드를 찾을 수 있습니다.
자원
- Bash로 프로그래밍하는 방법:구문 및 도구
- Bash로 프로그래밍하는 방법:논리 연산자 및 셸 확장
- Bash로 프로그래밍하는 방법:루프
이 기사 시리즈는 David Both의 Linux 자체 학습 과정인 3부로 구성된 Linux 사용 및 관리 - Zero to SysAdmin의 2권 10장을 부분적으로 기반으로 합니다.