시스템 관리자는 다양한 작업을 수행하기 위해 종종 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 , 명령을 반복합니다. ec 값 T 이후로 ls가 오류 조건을 보고하므로 이제 2가 됩니다. 찾을 수 없습니다.
이 오류 보고를 활용하여 위에서 설명한 것처럼 스크립트의 동작을 제어하는 논리를 포함할 수 있습니다.
테이크아웃
더 높은 기능을 위해 Python, C 또는 Java와 같은 언어를 사용해야 한다고 가정할 수 있지만 반드시 그런 것은 아닙니다. Bash 스크립팅 언어는 매우 강력합니다. 그 유용성을 극대화하기 위해 배울 것이 많습니다. 이 몇 가지 예가 Bash로 코딩할 수 있는 가능성에 대해 조금이나마 설명해주기를 바랍니다.