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

Bash로 프로그래밍하는 방법:논리 연산자 및 셸 확장

Bash는 명령줄과 셸 스크립트에서 사용하도록 완벽하게 설계된 강력한 프로그래밍 언어입니다. 이 3부작 시리즈(저의 3부 Linux 독학 과정을 기반으로 함)는 명령줄 인터페이스(CLI)에서 프로그래밍 언어로 Bash를 사용하는 방법을 탐구합니다.

첫 번째 기사에서는 변수 및 제어 연산자 사용을 포함하여 Bash를 사용한 몇 가지 간단한 명령줄 프로그래밍을 살펴보았습니다. 이 두 번째 기사에서는 Bash에서 실행 흐름 제어 논리와 다양한 유형의 셸 확장을 제공하는 파일, 문자열, 숫자 및 기타 논리 연산자 유형을 살펴봅니다. 시리즈의 세 번째이자 마지막 기사에서는 for , 동안까지 반복 작업을 가능하게 하는 루프.

논리 연산자는 프로그램에서 결정을 내리고 이러한 결정에 따라 다양한 명령 집합을 실행하는 기초입니다. 이를 흐름 제어라고도 합니다.

논리 연산자

Bash에는 조건식에 사용할 수 있는 많은 논리 연산자 세트가 있습니다. if의 가장 기본적인 형태 제어 구조는 조건을 테스트한 다음 조건이 참이면 프로그램 명령문 목록을 실행합니다. 연산자에는 파일, 숫자 및 비숫자 연산자의 세 가지 유형이 있습니다. 각 연산자는 조건이 충족되면 true(0)를 반환하고 조건이 충족되지 않으면 false(1)를 반환합니다.

이러한 비교 연산자의 기능적 구문은 대괄호 안에 배치된 연산자가 있는 하나 또는 두 개의 인수이며, 그 뒤에 조건이 true인 경우 실행되는 프로그램 명령문의 목록이 따르고 조건이 false인 경우 선택적 프로그램 명령문 목록이 뒤따릅니다. :

if [ arg1 연산자 arg2 ]; then list
또는
if [ arg1 operator arg2 ]; 그런 다음 목록; 다른 목록; fi

그림과 같이 비교에 공백이 필요합니다. 단일 대괄호, []테스트와 동일한 전통적인 Bash 기호입니다. 명령:

if test arg1 operator arg2 ; then list 

몇 가지 장점을 제공하고 일부 시스템 관리자가 선호하는 보다 최근의 구문도 있습니다. 이 형식은 다른 버전의 Bash 및 ksh(Korn 셸)와 같은 다른 셸과 약간 덜 호환됩니다. 다음과 같습니다.

if [[ arg1 operator arg2 ]] ; then list 

파일 연산자

파일 연산자는 Bash 내에서 강력한 논리 연산자 집합입니다. 그림 1은 Bash가 파일에 대해 수행할 수 있는 20개 이상의 다른 연산자를 나열합니다. 스크립트에서 아주 자주 사용합니다.

연산자 설명
-파일 이름 파일이 존재하면 참이고, 그렇지 않으면 참입니다. 비어 있거나 일부 내용이 있을 수 있지만 존재하는 한 사실입니다.
-b 파일 이름 파일이 존재하고 /dev/sda와 같은 하드 드라이브와 같은 블록 특수 파일인 경우 참 또는 /dev/sda1
-c 파일 이름 파일이 존재하고 /dev/TTY1과 같은 TTY 장치와 같은 문자 특수 파일인 경우 참
-d 파일 이름 파일이 존재하고 디렉토리이면 참
-e 파일 이름 파일이 존재하면 참이고, 그렇지 않으면 참입니다. 이것은 -와 동일합니다. 위
-f 파일 이름 파일이 존재하고 디렉토리, 장치 특수 파일 또는 링크가 아닌 일반 파일인 경우 참
-g 파일 이름 파일이 존재하고 set-group-id이면 참 , SETGID
-h 파일 이름 파일이 존재하고 심볼릭 링크이면 참
-k 파일 이름 파일이 존재하고 "고정" 비트가 설정되어 있으면 참
-p 파일 이름 파일이 존재하고 명명된 파이프(FIFO)인 경우 참
-r 파일 이름 파일이 존재하고 읽을 수 있는 경우, 즉 읽기 비트가 설정되어 있으면 참입니다.
-s 파일 이름 파일이 존재하고 크기가 0보다 크면 참입니다. 존재하지만 크기가 0인 파일은 false를 반환합니다.
-t fd 파일 설명자가 fd이면 참 열려 있고 터미널을 참조합니다.
-u 파일 이름 파일이 존재하고 set-user-id이면 참 비트가 설정되었습니다
-w 파일 이름 파일이 존재하고 쓰기 가능하면 참
-x 파일 이름 파일이 존재하고 실행 가능한 경우 참
-G 파일 이름 파일이 존재하고 유효 그룹 ID가 소유한 경우 참
-L 파일 이름 파일이 존재하고 심볼릭 링크이면 참
-N 파일 이름 파일이 존재하고 마지막으로 읽은 이후 수정된 경우 참
-O 파일 이름 파일이 존재하고 유효 사용자 ID가 소유한 경우 참
-S 파일 이름 파일이 존재하고 소켓이면 참
파일1 -ef 파일2 file1과 file2가 동일한 장치 및 iNode 번호를 참조하는 경우 참
파일1 -nt 파일2 file1이 file2보다 최신(수정 날짜에 따라)이거나 file1이 있고 file2가 없는 경우 true
파일1 -ot 파일2 file1이 file2보다 오래된 경우 또는 file2가 있고 file1이 없는 경우 true

그림. 1:Bash 파일 연산자

예를 들어 파일의 존재 여부를 테스트하는 것으로 시작하십시오.

[student@studentvm1 testdir]$ 파일="테스트파일1"; if [ -e $파일 ]; then echo "$File 파일이 존재합니다."; else echo "$File 파일이 존재하지 않습니다."; fi
TestFile1 파일이 존재하지 않습니다.
[student@studentvm1 testdir]$

다음으로 TestFile1이라는 테스트용 파일을 만듭니다. . 현재로서는 데이터를 포함할 필요가 없습니다.

[student@studentvm1 testdir]$ touch TestFile1 

$File의 값을 쉽게 변경할 수 있습니다. 이 짧은 CLI 프로그램의 여러 위치에 있는 파일 이름에 대한 텍스트 문자열이 아닌 변수:

[student@studentvm1 testdir]$ 파일="테스트파일1"; if [ -e $파일 ]; then echo "$File 파일이 존재합니다."; else echo "$File 파일이 존재하지 않습니다."; fi
TestFile1 파일이 존재합니다.
[student@studentvm1 testdir]$

이제 테스트를 실행하여 파일이 존재하고 길이가 0이 아니면 데이터가 포함되어 있는지 확인합니다. 다음 세 가지 조건에 대해 테스트하려고 합니다. 1. 파일이 존재하지 않습니다. 2. 파일이 존재하고 비어 있습니다. 3. 파일이 존재하고 데이터를 포함합니다. 따라서 더 복잡한 테스트 세트가 필요합니다. elif를 사용하세요. if-elif-else의 스탠자 모든 조건을 테스트하는 구성:

[student@studentvm1 testdir]$ 파일="테스트파일1"; if [ -s $파일 ]; then echo "$File이 존재하고 데이터를 포함합니다."; fi
[student@studentvm1 testdir]$

이 경우 파일은 존재하지만 데이터를 포함하지 않습니다. 데이터를 추가하고 다시 시도하십시오.

[student@studentvm1 testdir]$ 파일="테스트파일1"; echo "$File 파일입니다."> $File; if [ -s $파일 ]; then echo "$File이 존재하고 데이터를 포함합니다."; fi
TestFile1이 존재하고 데이터를 포함합니다.
[student@studentvm1 testdir]$

그것은 작동하지만 세 가지 가능한 조건 중 하나의 특정 조건에 대해서만 진정으로 정확합니다. 기타 추가 스탠자를 사용하여 좀 더 정확하고 이 새 코드를 완전히 테스트할 수 있도록 파일을 삭제합니다.

[student@studentvm1 testdir]$ 파일="테스트파일1"; rm $파일; if [ -s $파일 ]; then echo "$File이 존재하고 데이터를 포함합니다."; else echo "$File이 존재하지 않거나 비어 있습니다."; fi
TestFile1이 존재하지 않거나 비어 있습니다.

이제 테스트할 빈 파일을 만듭니다.

[student@studentvm1 testdir]$ 파일="테스트파일1"; 터치 $파일; if [ -s $파일 ]; then echo "$File이 존재하고 데이터를 포함합니다."; else echo "$File이 존재하지 않거나 비어 있습니다."; fi
TestFile1이 존재하지 않거나 비어 있습니다.

파일에 일부 콘텐츠를 추가하고 다시 테스트하십시오.

[student@studentvm1 testdir]$ 파일="테스트파일1"; echo "$File 파일입니다."> $File; if [ -s $파일 ]; then echo "$File이 존재하고 데이터를 포함합니다."; else echo "$File이 존재하지 않거나 비어 있습니다."; fi
TestFile1이 존재하고 데이터를 포함합니다.

이제 elif를 추가합니다. 존재하지 않는 파일과 비어 있는 파일을 구별하는 스탠자:

[student@studentvm1 testdir]$ 파일="테스트파일1"; 터치 $파일; if [ -s $파일 ]; then echo "$File이 존재하고 데이터를 포함합니다."; elif [ -e $파일 ]; then echo "$File이 존재하고 비어 있습니다."; else echo "$File이 존재하지 않습니다."; fi
TestFile1이 존재하며 비어 있습니다.
[student@studentvm1 testdir]$ File="TestFile1"; echo "$File입니다."> $File; if [ -s $파일 ]; then echo "$File이 존재하고 데이터를 포함합니다."; elif [ -e $파일 ]; then echo "$File이 존재하고 비어 있습니다."; else echo "$File이 존재하지 않습니다."; fi
TestFile1이 존재하고 데이터를 포함합니다.
[student@studentvm1 testdir]$

이제 이 세 가지 조건을 테스트할 수 있는 Bash CLI 프로그램이 생겼습니다. 하지만 가능성은 무한합니다.

파일에 저장할 수 있는 스크립트에서와 같이 프로그램 명령문을 정렬하면 더 복잡한 복합 명령의 논리 구조를 더 쉽게 볼 수 있습니다. 그림 2는 이것이 어떻게 보이는지 보여줍니다. if-elif-else의 각 스탠자에 있는 프로그램 문의 들여쓰기 구조는 논리를 명확히 하는 데 도움이 됩니다.

File="TestFile1"
echo "$File입니다."> $File
if [ -s $File ]
   then
   echo "$File이 존재하고 데이터를 포함합니다. ."
elif [ -e $File ]
   then
   echo "$File이 존재하며 비어 있습니다."
else
   echo "$File이 없습니다."
파이

그림. 2:스크립트에 나타나는 대로 재작성된 명령줄 프로그램

이 복잡한 논리는 대부분의 CLI 프로그램에서 너무 깁니다. Linux 또는 Bash 내장 명령을 CLI 프로그램에서 사용할 수 있지만 CLI 프로그램이 점점 더 길어지고 복잡해짐에 따라 파일에 저장되어 언제든지 실행할 수 있는 스크립트를 만드는 것이 더 합리적입니다. 앞으로.

문자열 비교 연산자

문자열 비교 연산자를 사용하면 문자의 영숫자 문자열을 비교할 수 있습니다. 이러한 연산자는 그림 3에 나열되어 있는 몇 가지만 있습니다.

연산자 설명
-z 문자열 문자열 길이가 0이면 참
-n 문자열 문자열 길이가 0이 아니면 참
문자열1 ==문자열2

또는

문자열1 =문자열2
문자열이 같으면 참이고, 그렇지 않으면 참입니다. 단일 = POSIX 적합성을 위한 테스트 명령과 함께 사용해야 합니다. [[ 명령을 사용하면 위에서 설명한 대로 패턴 일치를 수행합니다(복합 명령).
문자열1 !=문자열2 문자열이 같지 않으면 참
문자열1 <문자열2 문자열1이 사전순으로 문자열2보다 먼저 정렬되면 참(모든 영숫자 및 특수 문자에 대한 로케일별 정렬 순서 참조)
문자열1> 문자열2 문자열1이 사전순으로 문자열2 이후에 정렬되면 참

그림. 3:Bash 문자열 논리 연산자

먼저 문자열 길이를 확인합니다. $MyVar 주변의 따옴표 비교가 작동하려면 비교가 있어야 합니다. (당신은 여전히 ​​~/testdir에서 작업 중이어야 합니다. .)

[student@studentvm1 testdir]$ MyVar=""; if [ -z "" ]; then echo "MyVar는 길이가 0입니다."; else echo "MyVar에는 데이터가 포함되어 있습니다."; fi
MyVar는 길이가 0입니다.
[student@studentvm1 testdir]$ MyVar="Random text"; if [ -z "" ]; then echo "MyVar는 길이가 0입니다."; else echo "MyVar에는 데이터가 포함되어 있습니다."; fi
MyVar는 길이가 0입니다.

다음과 같이 할 수도 있습니다.

[student@studentvm1 testdir]$ MyVar="랜덤 텍스트"; if [ -n "$MyVar" ]; then echo "MyVar에 데이터가 포함되어 있습니다."; else echo "MyVar는 길이가 0입니다."; fi
MyVar에 데이터가 있습니다.
[student@studentvm1 testdir]$ MyVar=""; if [ -n "$MyVar" ]; then echo "MyVar에 데이터가 포함되어 있습니다."; else echo "MyVar는 길이가 0입니다."; fi
MyVar는 길이가 0입니다.

때로는 문자열의 정확한 길이를 알아야 할 수도 있습니다. 이것은 비교가 아니라 관련이 있습니다. 불행히도 문자열의 길이를 결정하는 간단한 방법은 없습니다. 몇 가지 방법이 있지만 expr (표현식 평가) 명령이 가장 쉽습니다. expr 매뉴얼 페이지 읽기 할 수 있는 일에 대해 자세히 알아보십시오. 테스트 중인 문자열이나 변수를 따옴표로 묶어야 합니다.

[student@studentvm1 testdir]$ MyVar=""; expr 길이 "$MyVar"
0
[student@studentvm1 testdir]$ MyVar="얼마나 걸립니까?"; expr length "$MyVar"
17
[student@studentvm1 testdir]$ expr length "변수뿐만 아니라 리터럴 문자열의 길이도 찾을 수 있습니다."
70

비교 연산자와 관련하여 두 문자열이 동일한지(즉, 동일한지) 확인하기 위해 스크립트에서 많은 테스트를 사용합니다. 이 비교 연산자의 비 POSIX 버전을 사용합니다.

[student@studentvm1 testdir]$ Var1="Hello World"; Var2="Hello World"; if [ "$Var1" =="$Var2" ]; then echo "Var1은 Var2와 일치합니다"; else echo "Var1과 Var2가 일치하지 않습니다."; fi
Var1은 Var2와 일치합니다.
[student@studentvm1 testdir]$ Var1="Hello World"; Var2="안녕하세요 세계"; if [ "$Var1" =="$Var2" ]; then echo "Var1은 Var2와 일치합니다"; else echo "Var1과 Var2가 일치하지 않습니다."; fi
Var1과 Var2가 일치하지 않습니다.

이 연산자를 사용해 보려면 직접 몇 가지 더 실험해 보세요.

숫자 비교 연산자

숫자 연산자는 두 숫자 인수를 비교합니다. 다른 연산자 클래스와 마찬가지로 대부분 이해하기 쉽습니다.

연산자 설명
arg1 -eq arg2 arg1이 arg2와 같으면 참
arg1 -ne arg2 arg1이 arg2와 같지 않으면 참
arg1 -lt arg2 arg1이 arg2보다 작으면 참
arg1 -le arg2 arg1이 arg2보다 작거나 같으면 참
arg1 -gt 인수2 arg1이 arg2보다 크면 참
arg1 -ge arg2 arg1이 arg2보다 크거나 같으면 참

그림. 4:Bash 숫자 비교 논리 연산자

다음은 몇 가지 간단한 예입니다. 첫 번째 인스턴스는 $X 변수를 설정합니다. 1로 변경한 다음 $X인지 테스트합니다. 는 1과 같습니다. 두 번째 경우 X 0으로 설정되어 비교가 사실이 아닙니다.

[student@studentvm1 testdir]$ X=1; if [ $X -eq 1 ]; then echo "X는 1입니다"; else echo "X는 1이 아닙니다."; fi
X는 1과 같습니다.
[student@studentvm1 testdir]$ X=0; if [ $X -eq 1 ]; then echo "X는 1입니다"; else echo "X는 1이 아닙니다."; fi
X가 1과 같지 않음
[student@studentvm1 testdir]$

직접 실험을 더 시도해 보세요.

기타 연산자

이러한 기타 연산자는 쉘 옵션이 설정되었는지 또는 쉘 변수에 값이 있는지 여부를 표시하지만 변수 값을 발견하지 않고 변수에 값이 있는지 여부만 알 수 있습니다.

연산자 설명
-o 옵션 이름 셸 옵션 optname이 활성화된 경우 참(-o 설명 아래에 있는 옵션 목록 참조 Bash 매뉴얼 페이지에 내장된 Bash 세트 옵션)
-v 변수 이름 셸 변수 varname이 설정되면 참입니다(값이 할당됨)
-R 변수명 셸 변수 varname이 설정되고 이름 참조인 경우 참입니다.

그림. 5:기타 Bash 논리 연산자

이러한 연산자를 직접 실험해 보십시오.

확장

Bash는 매우 유용할 수 있는 다양한 유형의 확장 및 대체를 지원합니다. Bash 매뉴얼 페이지에 따르면 Bash에는 7가지 형태의 확장이 있습니다. 이 문서에서는 물결표 확장, 산술 확장, 경로 이름 확장, 중괄호 확장 및 명령 대체의 5가지를 살펴봅니다.

중괄호 확장

중괄호 확장은 임의의 문자열을 생성하는 방법입니다. (이 도구는 아래에서 특수 패턴 문자를 사용한 실험을 위해 많은 수의 파일을 만드는 데 사용됩니다.) 중괄호 확장을 사용하여 임의의 문자열 목록을 생성하고 묶는 정적 문자열 내의 특정 위치에 삽입하거나 정적 문자열. 이것은 시각화하기 어려울 수 있으므로 그냥 하는 것이 가장 좋습니다.

먼저 중괄호 확장의 기능은 다음과 같습니다.

[student@studentvm1 testdir]$ echo {string1,string2,string3}
string1 string2 string3

글쎄요, 별로 도움이 되지 않죠? 하지만 조금 다르게 사용하면 어떻게 되는지 살펴보세요.

[student@studentvm1 testdir]$ echo "안녕하세요 "{David,Jen,Rikki,Jason}.
안녕하세요. 안녕하세요 젠입니다. 안녕하세요 리키입니다. 안녕하세요 제이슨입니다.

뭔가 유용한 것 같습니다. 타이핑 시간을 많이 절약할 수 있습니다. 이제 이것을 시도하십시오:

[student@studentvm1 testdir]$ echo b{ed,olt,ar}s
침대 볼트 바

계속할 수 있지만 아이디어는 알 수 있습니다.

물결표 확장

틀림없이 가장 일반적인 확장은 물결표(~ ) 확장. cd ~/Documents와 같은 명령에서 이것을 사용할 때 , Bash 셸은 이를 사용자의 전체 홈 디렉토리에 대한 바로 가기로 확장합니다.

다음 Bash 프로그램을 사용하여 물결표 확장의 효과를 관찰하십시오.

[student@studentvm1 testdir]$ echo ~
/home/student
[student@studentvm1 testdir]$ echo ~/Documents
/home/student/Documents
[ student@studentvm1 testdir]$ Var1=~/문서; 에코 $Var1; cd $Var1
/home/student/Documents
[student@studentvm1 문서]$

경로 확장

경로 이름 확장은 ? 문자를 사용하여 파일 글로빙 패턴을 확장하는 멋진 용어입니다. 및 * , 패턴과 일치하는 디렉토리의 전체 이름으로. 파일 글로빙은 다양한 작업을 수행할 때 파일 이름, 디렉터리 및 기타 문자열을 일치시키는 데 상당한 유연성을 제공하는 특수 패턴 문자를 나타냅니다. 이러한 특수 패턴 문자를 사용하면 문자열에서 단일, 다중 또는 특정 문자를 일치시킬 수 있습니다.

  • ? — 문자열 내의 지정된 위치에 있는 문자 중 하나만 일치
  • * — 문자열 내의 지정된 위치에 있는 0개 이상의 문자와 일치

이 확장은 일치하는 디렉토리 이름에 적용됩니다. 이것이 어떻게 작동하는지 보려면 testdir 현재 작업 디렉토리(PWD)이며 일반 목록으로 시작합니다(내 홈 디렉토리의 내용은 귀하의 것과 다름):

[student@studentvm1 testdir]$ ls 
chapter6  cpuHog.dos    dmesg1.txt  문서  음악        softlink1  testdir6    testicplate  동영상
chapter7  cpuHog.Linux.txt  dmes dmesg3.txt  file005    공개      testdir    tmp
cpuHog     데스크톱       dmesg.txt   link3      random.txt  testdir1   umask.test
[$vm1> pre test@student

이제 Do로 시작하는 디렉토리를 나열합니다. , testdir/문서 , 및 testdir/다운로드 :


directory01 File07 File15 Test02 Test10 Test20 TestFile13 TestFile13 TextFiles
directory02 File16 Test03 TestFile01 TestFile01 TestFile14
file09 file17 test04 testfile04
file 10118 test013 test13 test13 test013 test013 test013 test013 test013 test013 file17
file03 file111 file19 test06 test14 testfile09 testfile17
file012 file12 file20 test07 test15 testfile10 testfile18
file05 file13 student1.txt test08 test16 testfile11 testfile19
file06 file14 test09 testfile12 test /?
다운로드:
[student@studentvm1 testdir]$

글쎄, 그것은 당신이 원하는 것을하지 못했습니다. Do로 시작하는 디렉토리의 내용을 나열했습니다. . 디렉토리만 나열하고 컨텐츠는 나열하지 않으려면 -d를 사용하십시오. 옵션.

[student@studentvm1 testdir]$ ls -d Do*
문서  다운로드
[student@studentvm1 testdir]$

두 경우 모두 Bash 셸은 Do를 확장합니다. * 패턴을 패턴과 일치하는 두 디렉토리의 이름으로 입력합니다. 하지만 패턴과 일치하는 파일도 있다면 어떻게 될까요?

[student@studentvm1 testdir]$ 터치 시내; ls -d Do*
문서  다운로드  다운타운
[student@studentvm1 testdir]$

이것은 파일도 보여줍니다. 따라서 패턴과 일치하는 모든 파일도 전체 이름으로 확장됩니다.

명령 대체

명령 대체는 한 명령의 STDOUT 데이터 스트림을 다른 명령의 인수로 사용할 수 있도록 하는 확장 형식입니다. 예를 들어 루프에서 처리할 항목 목록입니다. Bash 매뉴얼 페이지에는 "명령 대체를 통해 명령 출력이 명령 이름을 대체할 수 있습니다."라고 나와 있습니다. 약간 둔한 경우 정확하다고 생각합니다.

이 대체에는 `command`의 두 가지 형식이 있습니다. 및 $(명령) . 등 틱(`)을 사용하는 이전 형식 ), 백슬래시(\ 사용) ) 명령의 리터럴 의미를 유지합니다. 그러나 새로운 괄호 형식으로 사용될 때 백슬래시는 특수 문자로서의 의미를 갖습니다. 또한 괄호 형식은 단일 괄호만 사용하여 명령문을 열고 닫습니다.

한 명령의 결과를 다른 명령의 인수로 사용할 수 있는 명령줄 프로그램 및 스크립트에서 이 기능을 자주 사용합니다.

이 확장의 두 가지 형식을 모두 사용하는 매우 간단한 예부터 시작합니다(다시 testdir PWD):

[student@studentvm1 testdir]$ echo "오늘 날짜는 `date`"
오늘 날짜는 Sun Apr  7 14:42:46 EDT 2019
[student@studentvm1 testdir]$ echo "오늘 날짜는 $(date)"입니다."
오늘 날짜는 Sun 4월 7일 14:42:59 EDT 2019
[student@studentvm1 testdir]$

-w seq 옵션 유틸리티는 생성된 숫자에 선행 0을 추가하여 값에 관계없이 모두 동일한 너비, 즉 동일한 자릿수가 되도록 합니다. 이렇게 하면 숫자 순서로 더 쉽게 정렬할 수 있습니다.

시퀀스 유틸리티는 일련의 숫자를 생성하는 데 사용됩니다.

[student@studentvm1 testdir]$ seq 5
1
2
3
4
5
[student@studentvm1 testdir]$ echo ` 시퀀스 5`
1 2 3 4 5
[student@studentvm1 테스트 디렉토리]$

이제 테스트를 위해 많은 수의 빈 파일을 만드는 것과 같이 좀 더 유용한 작업을 수행할 수 있습니다.

[student@studentvm1 testdir]$ for I in $(seq -w 5000) ; do touch file-$I ; done 

이 사용법에서 seq -w 5000 문은 1에서 5,000까지의 숫자 목록을 생성합니다. for의 일부로 명령 대체를 사용하여 문에서 숫자 목록은 for 파일 이름의 숫자 부분을 생성하는 문.

산술 확장

Bash는 정수 연산을 수행할 수 있지만 다소 복잡합니다(곧 보게 될 것입니다). 산술 확장 구문은 $((arithmetic-expression))입니다. , 이중 괄호를 사용하여 표현식을 열고 닫습니다.

산술 확장은 쉘 프로그램이나 스크립트에서 명령 대체처럼 작동합니다. 표현식에서 계산된 값은 쉘에서 추가 평가를 위해 표현식을 대체합니다.

다시 한 번 간단한 것부터 시작하세요.

[student@studentvm1 testdir]$ echo $((1+1))
2
[student@studentvm1 testdir]$ Var1=5; 변수2=7; Var3=$((Var1*Var2)); echo "변수 3 =$Var3"
변수 3 =35

다음 나누기는 결과가 1보다 작은 십진수 값이므로 0이 됩니다.

[student@studentvm1 testdir]$ Var1=5; 변수2=7; Var3=$((Var1/Var2)); echo "변수 3 =$Var3"
변수 3 =0

다음은 Linux 호스트에 있는 총 가상 메모리의 양을 알려주는 스크립트 또는 CLI 프로그램에서 자주 수행하는 간단한 계산입니다. 무료 명령은 해당 데이터를 제공하지 않습니다:

[student@studentvm1 testdir]$ RAM=`무료 | grep ^멤 | awk '{인쇄 $2}''; 스왑=`무료 | grep ^스왑 | awk '{인쇄 $2}''; echo "RAM =$RAM 및 스왑 =$Swap"; echo "총 가상 메모리는 $((RAM+Swap))";
RAM =4037080 및 스왑 =6291452
총 가상 메모리는 10328532

`을(를) 사용했습니다. 명령 대체에 사용되는 코드 섹션을 구분하는 문자입니다.

저는 주로 스크립트에서 시스템 리소스 양을 확인하기 위해 Bash 산술 확장을 사용하고 결과에 따라 프로그램 실행 경로를 선택합니다.

요약

프로그래밍 언어로서의 Bash에 대한 이 시리즈의 두 번째 기사에서는 실행 흐름 제어 논리와 다양한 유형의 셸 확장을 제공하는 Bash 파일, 문자열, 숫자 및 기타 논리 연산자를 살펴보았습니다.

이 시리즈의 세 번째 기사에서는 다양한 유형의 반복 작업을 수행하기 위해 루프를 사용하는 방법을 살펴봅니다.