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

Bash로 프로그래밍하는 방법:구문 및 도구

쉘은 운영 체제의 명령 해석기입니다. Bash는 내가 가장 좋아하는 셸이지만 모든 Linux 셸은 사용자나 시스템 관리자가 입력한 명령을 운영 체제에서 사용할 수 있는 형식으로 해석합니다. 결과가 셸 프로그램으로 반환되면 STDOUT에 결과를 보냅니다. STDOUT은 기본적으로 터미널에 결과를 표시합니다. 내가 친숙한 모든 쉘은 프로그래밍 언어이기도 합니다.

탭 완성, 명령줄 호출 및 편집과 같은 기능, 별칭과 같은 바로 가기는 모두 강력한 쉘로서의 가치에 기여합니다. 기본 명령줄 편집 모드는 Emacs를 사용하지만 내가 가장 좋아하는 Bash 기능 중 하나는 Vi 모드로 변경하여 이미 내 근육 기억의 일부인 편집 명령을 사용할 수 있다는 것입니다.

그러나 Bash를 셸로만 생각하면 진정한 힘을 많이 놓치게 됩니다. 3권으로 구성된 Linux 독학 과정(이 기사 시리즈의 기반이 됨)을 조사하는 동안 Linux를 사용한 20년 이상 동안 전혀 알지 못했던 Bash에 대해 배웠습니다. 이러한 새로운 지식 중 일부는 프로그래밍 언어로서의 사용과 관련이 있습니다. Bash는 명령줄과 셸 스크립트에서 사용하도록 완벽하게 설계된 강력한 프로그래밍 언어입니다.

3부로 구성된 이 시리즈에서는 Bash를 CLI(명령줄 인터페이스) 프로그래밍 언어로 사용하는 방법을 살펴봅니다. 이 첫 번째 기사에서는 Bash, 변수 및 제어 연산자를 사용한 몇 가지 간단한 명령줄 프로그래밍을 살펴봅니다. 다른 문서에서는 Bash 파일 유형을 살펴봅니다. 실행 흐름 제어 논리를 제공하는 문자열, 숫자 및 기타 논리 연산자 다양한 유형의 쉘 확장; 그리고 for , 동안까지 반복적인 작업을 가능하게 하는 루프. 또한 이러한 도구의 사용을 간소화하고 지원하는 몇 가지 명령도 살펴봅니다.

쉘은 운영 체제의 명령 해석기입니다. Bash는 내가 가장 좋아하는 셸이지만 모든 Linux 셸은 사용자나 시스템 관리자가 입력한 명령을 운영 체제에서 사용할 수 있는 형식으로 해석합니다. 결과가 쉘 프로그램으로 리턴되면 터미널에 표시됩니다. 내가 친숙한 모든 쉘은 프로그래밍 언어이기도 합니다.

Bash는 Bourne Again Shell의 약자입니다. Bash 셸은 1977년 Steven Bourne이 작성한 이전 Bourne 셸을 기반으로 하기 때문입니다. 다른 많은 셸을 사용할 수 있지만 가장 자주 접하는 4가지 셸입니다.

  • csh: C 언어의 구문을 좋아하는 프로그래머를 위한 C 쉘
  • 크시: David Korn이 작성하고 Unix 사용자에게 인기 있는 Korn 셸
  • tcsh: 보다 사용하기 쉬운 기능을 갖춘 csh 버전
  • zsh: 다른 인기 쉘의 많은 기능을 결합한 Z 쉘

모든 쉘에는 핵심 유틸리티에서 제공하는 명령을 보완하거나 대체하는 내장 명령이 있습니다. 쉘의 매뉴얼 페이지를 열고 "BUILT-INS" 섹션을 찾아 쉘이 제공하는 명령을 확인하십시오.

각 셸에는 고유한 특성과 구문이 있습니다. 일부는 다른 것보다 더 잘 작동합니다. C 셸, Korn 셸 및 Z 셸을 사용했습니다. 나는 여전히 Bash 쉘을 그 어떤 것보다 더 좋아합니다. 당신에게 가장 잘 맞는 것을 사용하세요. 하지만 그렇게 하려면 다른 것을 시도해야 할 수도 있습니다. 다행히 껍질을 바꾸는 것은 매우 쉽습니다.

이 셸은 모두 프로그래밍 언어이자 명령 인터프리터입니다. 다음은 Bash의 필수적인 부분인 일부 프로그래밍 구성 및 도구에 대한 간략한 둘러보기입니다.

프로그래밍 언어로서의 Bash

대부분의 시스템 관리자는 Bash를 사용하여 일반적으로 매우 간단하고 간단한 명령을 실행했습니다. 그러나 Bash는 단일 명령을 입력하는 것 이상을 할 수 있으며 많은 시스템 관리자는 일련의 작업을 수행하기 위해 간단한 명령줄 프로그램을 만듭니다. 이러한 프로그램은 시간과 노력을 절약할 수 있는 일반적인 도구입니다.

CLI 프로그램을 작성할 때의 목표는 시간과 노력을 절약하는 것입니다(즉, 게으른 시스템 관리자가 되는 것). CLI 프로그램은 차례로 실행되는 특정 순서로 여러 명령을 나열하여 이를 지원하므로 한 명령의 진행 상황을 주시하고 첫 번째 명령이 완료될 때 다음 명령을 입력할 필요가 없습니다. 다른 작업을 수행할 수 있으며 각 명령의 진행 상황을 지속적으로 모니터링할 필요가 없습니다.

"프로그램"이란 무엇입니까?

FOLDOC(Free Online Dictionary of Computing)에서는 프로그램을 다음과 같이 정의합니다. Princeton University의 WordNet은 프로그램을 "...컴퓨터가 해석하고 실행할 수 있는 일련의 명령..."으로 프로그램을 정의합니다. Wikipedia에도 컴퓨터 프로그램에 대한 좋은 항목이 있습니다.

따라서 프로그램은 특정 관련 작업을 수행하는 하나 이상의 명령어로 구성될 수 있습니다. 컴퓨터 프로그램 명령은 프로그램 명령문이라고도 합니다. 시스템 관리자의 경우 프로그램은 일반적으로 일련의 셸 명령입니다. Linux에서 사용할 수 있는 모든 셸(적어도 내가 알고 있는 것)에는 최소한 기본 형태의 프로그래밍 기능이 있으며 대부분의 Linux 배포판의 기본 셸인 Bash도 예외는 아닙니다.

이 시리즈에서는 Bash를 사용하지만(매우 유비쿼터스하기 때문에) 다른 셸을 사용하면 구성과 구문이 다소 다를 수 있지만 일반적인 프로그래밍 개념은 동일합니다. 일부 쉘은 다른 쉘이 지원하지 않는 일부 기능을 지원할 수 있지만 모두 일부 프로그래밍 기능을 제공합니다. 쉘 프로그램은 반복 사용을 위해 파일에 저장하거나 필요에 따라 명령줄에서 생성할 수 있습니다.

간단한 CLI 프로그램

가장 간단한 명령줄 프로그램은 Enter 전에 명령줄에 입력되는 하나 또는 두 개의 연속적인 프로그램 명령문으로 관련이 있을 수도 있고 그렇지 않을 수도 있습니다. 키가 눌렸습니다. 프로그램의 두 번째 명령문이 있는 경우 첫 번째 명령문에 종속될 수 있지만 반드시 그럴 필요는 없습니다.

또한 명확하게 명시해야 하는 구문적 구두점도 있습니다. 명령줄에 단일 명령을 입력할 때 Enter 키는 암시적 세미콜론(;)으로 명령을 종료합니다. ). CLI 셸 프로그램에서 명령줄에 한 줄로 입력하는 경우 각 명령문을 종료하고 다음 명령문과 구분하려면 세미콜론을 사용해야 합니다. CLI 셸 프로그램의 마지막 문은 명시적 또는 암시적 세미콜론을 사용할 수 있습니다.

몇 가지 기본 구문

다음 예에서는 이 구문을 명확하게 설명합니다. 이 프로그램은 명시적 종료자가 있는 단일 명령으로 구성됩니다.

[student@studentvm1 ~]$ echo "Hello world." ;
Hello world.

그다지 많은 프로그램처럼 보이지 않을 수도 있지만, 내가 배우는 모든 새로운 프로그래밍 언어를 접하는 첫 번째 프로그램입니다. 구문은 언어마다 약간 다를 수 있지만 결과는 동일합니다.

이 사소하지만 유비쿼터스 프로그램에 대해 조금 더 확장해 보겠습니다. 다른 실험을 수행했기 때문에 결과가 나와 다를 수 있지만 GUI 데스크탑을 통해 계정에 처음 로그인할 때 계정 홈 디렉토리에 생성된 기본 디렉토리와 파일만 있을 수 있습니다.

[student@studentvm1 ~]$ echo "My home directory." ; ls ;
My home directory.
chapter25   TestFile1.Linux  dmesg2.txt  Downloads  newfile.txt  softlink1  testdir6
chapter26   TestFile1.mac    dmesg3.txt  file005    Pictures     Templates  testdir
TestFile1      Desktop       dmesg.txt   link3      Public       testdir    Videos
TestFile1.dos  dmesg1.txt    Documents   Music      random.txt   testdir1

조금 더 의미가 있습니다. 결과는 관련되어 있지만 개별 프로그램 문은 서로 독립적입니다. 코드를 읽기 쉽게 만들기 때문에 세미콜론 앞뒤에 공백을 넣는 것을 좋아합니다. 끝에 명시적인 세미콜론 없이 작은 CLI 프로그램을 다시 시도하십시오.

[student@studentvm1 ~]$ echo "My home directory." ; ls 

출력에는 차이가 없습니다.

변수에 대한 정보

모든 프로그래밍 언어와 마찬가지로 Bash 셸은 변수를 처리할 수 있습니다. 변수는 일종의 값을 포함하는 메모리의 특정 위치를 나타내는 기호 이름입니다. 변수의 값은 변경 가능합니다. 즉, 가변적입니다.

Bash는 C 및 관련 언어와 같은 변수를 입력하지 않고 정수, 부동 소수점 또는 문자열 유형으로 정의합니다. Bash에서 모든 변수는 문자열입니다. 정수인 문자열은 Bash가 수행할 수 있는 유일한 수학 유형인 정수 산술에 사용할 수 있습니다. 더 복잡한 수학이 필요한 경우 bc 명령은 CLI 프로그램 및 스크립트에서 사용할 수 있습니다.

변수에는 값이 할당되며 CLI 프로그램 및 스크립트에서 해당 값을 참조하는 데 사용할 수 있습니다. 변수의 값은 이름을 사용하여 설정되지만 앞에 $가 붙지 않습니다. 징후. 할당 VAR=10 변수 VAR의 값을 10으로 설정합니다. 변수 값을 인쇄하려면 echo $VAR 문을 사용할 수 있습니다. . 텍스트(즉, 숫자가 아닌) 변수로 시작합니다.

Bash 변수는 설정 해제될 때까지 쉘 환경의 일부가 됩니다.

할당되지 않은 변수의 초기값을 확인하십시오. null이어야 합니다. 그런 다음 변수에 값을 할당하고 값을 확인하기 위해 인쇄합니다. 단일 CLI 프로그램에서 이 모든 작업을 수행할 수 있습니다.

[student@studentvm1 ~]$ echo $MyVar ; MyVar="Hello World" ; echo $MyVar ;

Hello World
[student@studentvm1 ~]$

참고:변수 할당 구문은 매우 엄격합니다. 등호(= ) 과제 명세서에 서명하십시오.

빈 줄은 MyVar의 초기 값이 null입니다. 변수의 값을 변경하고 설정하는 것도 같은 방식으로 수행됩니다. 이 예는 원래 값과 새 값을 모두 보여줍니다.

언급했듯이 Bash는 정수 산술 계산을 수행할 수 있으며 이는 배열에서 요소의 위치에 대한 참조를 계산하거나 간단한 수학 문제를 수행하는 데 유용합니다. 과학 계산이나 재무 계산과 같이 소수가 필요한 모든 작업에는 적합하지 않습니다. 이러한 유형의 계산을 위한 훨씬 더 나은 도구가 있습니다.

다음은 간단한 계산입니다.

[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var1*Var2))"
Result = 63

부동 소수점 숫자를 생성하는 수학 연산을 수행하면 어떻게 됩니까?

[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var1/Var2))"
Result = 0
[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var2/Var1))"
Result = 1
[student@studentvm1 ~]$

결과는 가장 가까운 정수입니다. 계산이 echo의 일부로 수행되었음을 알 수 있습니다. 성명. 수학은 Bash 우선 순위로 인해 둘러싸는 echo 명령보다 먼저 수행됩니다. 자세한 내용은 Bash 매뉴얼 페이지를 참조하고 "우선 순위"를 검색하십시오.

제어 연산자

셸 제어 연산자는 흥미로운 명령줄 프로그램을 쉽게 만들 수 있는 구문 연산자 중 하나입니다. CLI 프로그램의 가장 간단한 형태는 명령줄에서 여러 명령을 순서대로 묶는 것입니다.

command1 ; command2 ; command3 ; command4 ; . . . ; etc. ;

이러한 명령은 오류가 발생하지 않는 한 문제 없이 실행됩니다. 그러나 오류가 발생하면 어떻게됩니까? 내장된 &&를 사용하여 오류를 예상하고 허용할 수 있습니다. 그리고 || Bash 제어 연산자. 이 두 제어 연산자는 일부 흐름 제어를 제공하고 코드 실행 순서를 변경할 수 있도록 합니다. 세미콜론은 개행 문자와 마찬가지로 Bash 제어 연산자로도 간주됩니다.

&& 연산자는 단순히 "command1이 성공하면 command2를 실행합니다. command1이 어떤 이유로든 실패하면 command2를 건너뜁니다."라고 말합니다. 해당 구문은 다음과 같습니다.

command1 && command2

이제 새 디렉터리를 만들고 성공하면 현재 작업 디렉터리(PWD)로 만드는 몇 가지 명령을 살펴봅니다. 홈 디렉토리(~ )는 PWD입니다. 먼저 /root에서 시도해 보세요. , 액세스할 수 없는 디렉토리:

[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir/ && cd $Dir
mkdir: cannot create directory '/root/testdir/': Permission denied
[student@studentvm1 ~]$

mkdir에서 오류가 발생했습니다. 명령. 디렉토리 생성에 실패하여 파일을 생성할 수 없다는 오류를 받지 못했습니다. && 제어 운영자가 0이 아닌 반환 코드를 감지하여 터치 명령을 건너뛰었습니다. && 사용 제어 연산자가 터치를 방지합니다. 디렉토리를 생성하는 동안 오류가 발생하여 명령이 실행되지 않습니다. 이러한 유형의 명령줄 프로그램 흐름 제어는 오류가 복잡해지고 실제로 엉망이 되는 것을 방지할 수 있습니다. 하지만 조금 더 복잡해질 때입니다.

|| 제어 연산자를 사용하면 초기 프로그램 명령문이 0보다 큰 코드를 반환할 때 실행되는 다른 프로그램 명령문을 추가할 수 있습니다. 기본 구문은 다음과 같습니다.

command1 || command2 

이 구문은 "명령1이 실패하면 명령2를 실행합니다."입니다. 이는 command1이 성공하면 command2를 건너뛴다는 것을 의미합니다. 새 디렉토리를 만들어 보십시오:

[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir || echo "$Dir was not created."
mkdir: cannot create directory '/root/testdir': Permission denied
/root/testdir was not created.
[student@studentvm1 ~]$

이것이 바로 당신이 기대하는 것입니다. 새 디렉터리를 만들 수 없기 때문에 첫 번째 명령이 실패하고 두 번째 명령이 실행되었습니다.

이 두 연산자를 결합하면 두 가지의 장점을 모두 얻을 수 있습니다. 일부 흐름 제어를 사용하는 제어 연산자 구문은 && 그리고 || 제어 연산자가 사용됨:

preceding commands ; command1 && command2 || command3 ; following commands

이 구문은 다음과 같이 설명할 수 있습니다. "command1이 반환 코드 0으로 종료되면 command2를 실행하고 그렇지 않으면 command3을 실행합니다." 사용해 보세요:

[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."
mkdir: cannot create directory '/root/testdir': Permission denied
/root/testdir was not created.
[student@studentvm1 ~]$

이제 /root 대신 홈 디렉토리를 사용하여 마지막 명령을 다시 시도하십시오. 예배 규칙서. 이 디렉토리를 만들 수 있는 권한이 있습니다:

[student@studentvm1 ~]$ Dir=~/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."
[student@studentvm1 testdir]$

command1 &&command2와 같은 제어 연산자 구문 , 모든 명령이 성공적으로 완료되었는지 또는 실행 중에 어떤 유형의 실패가 있었는지 여부를 나타내는 반환 코드(RC)를 셸에 보내기 때문에 작동합니다. 규칙에 따라 RC가 0이면 성공을 나타내고 양수는 어떤 유형의 실패를 나타냅니다. 시스템 관리자가 사용하는 도구 중 일부는 실패를 나타내기 위해 일(1)을 반환하지만 많은 도구는 발생한 실패 유형을 나타내기 위해 다른 코드를 사용합니다.

Bash 쉘 변수 $? 마지막 명령의 RC를 포함합니다. 이 RC는 스크립트, 명령 목록의 다음 명령 또는 sysadmin을 통해 매우 쉽게 확인할 수 있습니다. 간단한 명령을 실행하고 즉시 RC를 확인하여 시작하십시오. RC는 항상 보기 전에 실행된 마지막 명령에 대한 것입니다.

[student@studentvm1 testdir]$ ll ; echo "RC = $?"
total 1264
drwxrwxr-x  2 student student   4096 Mar  2 08:21 chapter25
drwxrwxr-x  2 student student   4096 Mar 21 15:27 chapter26
-rwxr-xr-x  1 student student     92 Mar 20 15:53 TestFile1
<snip>
drwxrwxr-x. 2 student student 663552 Feb 21 14:12 testdir
drwxr-xr-x. 2 student student   4096 Dec 22 13:15 Videos
RC = 0
[student@studentvm1 testdir]$

이 경우 RC는 0이며 이는 명령이 성공적으로 완료되었음을 의미합니다. 이제 권한이 없는 디렉토리인 루트의 홈 디렉토리에서 동일한 명령을 시도하십시오.

[student@studentvm1 testdir]$ ll /root ; echo "RC = $?"
ls: cannot open directory '/root': Permission denied
RC = 2
[student@studentvm1 testdir]$

이 경우 RC는 2입니다. 이는 루트가 아닌 사용자가 액세스가 허용되지 않은 디렉토리에 액세스할 수 있는 권한이 거부되었음을 의미합니다. 제어 연산자는 이러한 RC를 사용하여 프로그램 실행 순서를 변경할 수 있도록 합니다.

요약

이 기사에서는 Bash를 프로그래밍 언어로 살펴보고 기본 구문과 몇 가지 기본 도구를 살펴보았습니다. 데이터를 STDOUT에 출력하는 방법과 변수 및 제어 연산자를 사용하는 방법을 보여주었습니다. 이 시리즈의 다음 기사에서는 명령 실행의 흐름을 제어하는 ​​많은 Bash 논리 연산자 중 일부를 살펴봅니다.