Computer >> 컴퓨터 >  >> 프로그램 작성 >> BASH 프로그래밍

Bash 스크립트를 개선하는 5가지 방법

시스템 관리자는 다양한 작업을 수행하기 위해 종종 Bash 스크립트를 작성합니다.

소프트웨어 공급업체에서 제공하는 설치 스크립트를 본 적이 있습니까? 설치가 제대로 작동하고 고객 시스템이 손상되지 않도록 하기 위해 종종 많은 기능과 논리를 추가합니다. 수년 동안 나는 Bash 스크립트를 향상시키기 위한 다양한 기술 모음을 축적했으며 다른 사람들을 도울 수 있기를 바라며 그 중 일부를 공유하고 싶습니다. 다음은 이러한 간단한 예를 설명하기 위해 만든 작은 스크립트 모음입니다.

시작

내가 시작할 때 내 Bash 스크립트는 일련의 명령에 불과했으며 일반적으로 웹 콘텐츠 배포와 같은 표준 셸 작업으로 시간을 절약하기 위한 것이었습니다. 그러한 작업 중 하나는 정적 컨텐츠를 Apache 웹 서버의 홈 디렉토리로 추출하는 것이었습니다. 내 스크립트는 다음과 같습니다.

cp january_schedule.tar.gz /usr/apache/home/calendar/
cd /usr/apache/home/calendar/
tar zvxf january_schedule.tar.gz

이것은 시간과 타이핑을 절약했지만 장기적으로 볼 때 그다지 흥미롭거나 유용한 스크립트는 아니었습니다. 시간이 지남에 따라 Bash 스크립트를 사용하여 소프트웨어 패키지 생성, 소프트웨어 설치 또는 파일 서버 백업과 같은 더 어려운 작업을 수행하는 다른 방법을 배웠습니다.

1. 조건문

다른 많은 프로그래밍 언어와 마찬가지로 조건문은 강력하고 일반적인 기능이었습니다. 조건문은 컴퓨터 프로그램에서 논리를 수행할 수 있게 해주는 것입니다. 대부분의 예제는 조건부 논리를 기반으로 합니다.

기본 조건문은 "if" 문을 사용합니다. 이를 통해 스크립트 수행 방식을 조작하는 데 사용할 수 있는 몇 가지 조건을 테스트할 수 있습니다. 예를 들어, Java가 설치되었음을 나타내는 Java bin 디렉토리가 있는지 확인할 수 있습니다. 발견되면 실행 경로를 Java 응용 프로그램에서 호출할 수 있도록 위치로 업데이트할 수 있습니다.

if [ -d "$JAVA_HOME/bin" ] ; then
    PATH="$JAVA_HOME/bin:$PATH"

2. 실행 제한

특정 사용자만 실행하도록 스크립트를 제한할 수 있습니다. Linux에는 이러한 유형의 보호를 활성화하기 위한 SELinux뿐만 아니라 사용자 및 그룹에 대한 표준 권한이 있지만 스크립트 내에 논리를 배치하도록 선택할 수 있습니다. 특정 웹 응용 프로그램의 소유자만 시작 스크립트를 실행할 수 있도록 하고 싶을 수도 있습니다. 코드를 사용하여 스크립트를 루트 사용자로 제한할 수도 있습니다. Linux에는 이 논리에서 테스트할 수 있는 몇 가지 환경 변수가 있습니다. 하나는 $USER입니다. , 사용자 이름을 제공합니다. 다른 하나는 $UID입니다. , 사용자의 식별 번호(UID)를 제공하고 스크립트의 경우 실행 중인 사용자의 UID를 제공합니다.

사용자

첫 번째 예는 여러 애플리케이션 서버 인스턴스가 있는 다중 호스팅 환경에서 사용자 jboss1로 스크립트를 제한하는 방법을 보여줍니다. 조건부 "if" 문은 본질적으로 "실행 중인 사용자가 jboss1이 아닙니까?"라고 묻습니다. 조건이 참이면 첫 번째 echo 문이 호출되고 그 다음 exit 1이 호출됩니다. 스크립트를 종료합니다.

if [ "$USER" != 'jboss1' ]; then
     echo "Sorry, this script must be run as JBOSS1!"
     exit 1
fi
echo "continue script"

루트

다음 예제 스크립트는 루트 사용자만 실행할 수 있도록 합니다. 루트의 UID가 0이므로 -gt를 사용할 수 있습니다. 0보다 큰 모든 UID를 금지하는 조건부 if 문의 옵션.

if [ "$UID" -gt 0 ]; then
     echo "Sorry, this script must be run as ROOT!"
     exit 1
fi
echo "continue script"

3. 인수 사용

모든 실행 프로그램과 마찬가지로 Bash 스크립트는 인수를 입력으로 사용할 수 있습니다. 다음은 몇 가지 예입니다. 그러나 먼저 좋은 프로그래밍이란 우리가 원하는 것을 수행하는 응용 프로그램을 작성하지 않는다는 것을 의미한다는 것을 이해해야 합니다. 우리는 할 수 없는 애플리케이션을 작성해야 합니다. 우리가 하지 않는 일을 하십시오 원하다. 논쟁이 없는 경우 스크립트가 파괴적인 작업을 수행하지 않도록 하고 싶습니다. 따라서 이것은 y를 확인하는 첫 번째 검사입니다. 조건은 인수 수 $#를 확인합니다. , 값이 0이면 스크립트를 종료하고 true이면 스크립트를 종료합니다.

if [ $# -eq 0 ]; then
    echo "No arguments provided"
    exit 1
fi
echo "arguments found: $#"

여러 인수

스크립트에 둘 이상의 인수를 전달할 수 있습니다. 스크립트가 각 인수를 참조하는 데 사용하는 내부 변수는 $1과 같이 단순히 증가합니다. , $2 , $3 , 등등. 위의 예를 다음 줄로 확장하여 처음 세 개의 인수를 반영하겠습니다. 분명히, 총 수를 기반으로 적절한 인수 처리를 위해 추가 논리가 필요합니다. 이 예는 설명을 위해 간단합니다.

echo $1 $2 $3

이러한 인수 변수에 대해 논의하는 동안 "그가 0을 건너뛰었습니까?"

네, 그랬습니다. 하지만 큰 이유가 있습니다! 실제로 $0이(가) 있습니다. 변수이며 매우 유용합니다. 그 값은 단순히 실행 중인 스크립트의 이름입니다.

echo $0

실행 중에 스크립트 이름을 참조하는 중요한 이유는 스크립트 이름을 자체 이름에 포함하는 로그 파일을 생성하기 위해서입니다. 가장 간단한 형태는 echo 문일 수 있습니다.

echo test >> $0.log

그러나 사용 사례에 도움이 되는 이름과 정보로 로그가 위치에 기록되도록 코드를 조금 더 추가하고 싶을 것입니다.

4. 사용자 입력

스크립트에서 사용할 수 있는 또 다른 유용한 기능은 실행 중에 입력을 수락하는 기능입니다. 가장 간단한 방법은 사용자에게 정보를 제공하는 것입니다.

echo "enter a word please:"
 read word
 echo $word

이를 통해 사용자에게 선택권을 제공할 수도 있습니다.

read -p "Install Software ?? [Y/n]: " answ
 if [ "$answ" == 'n' ]; then
   exit 1
 fi
   echo "Installation starting..."

5. 실패 시 종료

몇 년 전에 저는 제 컴퓨터에 최신 버전의 JDK(Java Development Kit)를 설치하기 위한 스크립트를 작성했습니다. 스크립트는 JDK 아카이브를 특정 디렉토리로 추출하고, 심볼릭 링크를 업데이트하고, 대체 유틸리티를 사용하여 시스템이 새 버전을 인식하도록 합니다. JDK 아카이브 추출에 실패한 경우 계속하면 Java 시스템 전체가 손상될 수 있습니다. 그래서 그런 상황에서 스크립트를 중단하고 싶었습니다. 아카이브가 성공적으로 추출되지 않는 한 스크립트가 다음 시스템 변경 세트를 만드는 것을 원하지 않습니다. 다음은 해당 스크립트에서 발췌한 내용입니다.

tar kxzmf jdk-8u221-linux-x64.tar.gz -C /jdk --checkpoint=.500; ec=$?
if [ $ec -ne 0 ]; then
     echo "Installation failed - exiting."
     exit 1
fi

$?의 사용법을 빠르게 보여줄 수 있는 방법 변수는 이 짧은 한 줄로 되어 있습니다.

ls T; ec=$?; echo $ec

먼저 터치 T를 실행합니다. 이 명령이 뒤따릅니다. ec 값 0이 됩니다. 그런 다음 T를 삭제합니다. , rm T , 명령을 반복합니다. ecT 이후로 ls가 오류 조건을 보고하므로 이제 2가 됩니다. 찾을 수 없습니다.

이 오류 보고를 활용하여 위에서 설명한 것처럼 스크립트의 동작을 제어하는 ​​논리를 포함할 수 있습니다.

테이크아웃

더 높은 기능을 위해 Python, C 또는 Java와 같은 언어를 사용해야 한다고 가정할 수 있지만 반드시 그런 것은 아닙니다. Bash 스크립팅 언어는 매우 강력합니다. 그 유용성을 극대화하기 위해 배울 것이 많습니다. 이 몇 가지 예가 Bash로 코딩할 수 있는 가능성에 대해 조금이나마 설명해주기를 바랍니다.