쉘 프로그래밍을 얻기 위한 리눅스 하나의 "텍스트"

다시 졸업 시즌이고 인턴십 일자리를 다시 찾아야 합니다. . .

최근에 직접 고용 소프트웨어에서 인턴십 일자리를 찾고 있었는데 쉘 프로그래밍이 필요한 직업이 많은 것을 보았고 쉘 프로그래밍에 대해 잘 알지 못하기 때문에 아직 수업 시간이 보름 정도 남아 있습니다. 그것!


Shell은 애플리케이션 또는 사용자 명령을 수신한 다음 운영 체제 커널을 호출하여 작업을 수행하는 명령줄 인터프리터입니다!

Shell은 또한 매우 강력한 프로그래밍 언어로 쓰기 쉽고 디버그하기 쉽고 유연합니다.

Shell은 스크립팅 언어라고도 할 수 있습니다!

Shell은 bash와 sh로 나뉘며 둘 다 매크로 관점에서 실제로는 동일합니다.


목차

1. 쉘 스크립트 시작하기

1.1 Shell 스크립트의 세 가지 실행 방법

2. 변수

2.1 시스템 사전 정의 변수

2.2 맞춤 변수

2.2.1 기본 구문

2.2.2 변수 정의 규칙

2.2.3 사례

2.3 특수 변수

2.3.1 $n

2.3.2 $#

2.3.3 $*

2.3.4 $@

2.3.5$?

3. 운영자

4. 조건 판단

4.1 기본 구문

4.2 공통 판정 조건

        4.2.1 문자열 비교        

         4.2.2 정수 간의 비교

        4.2.3 파일 권한으로 판단

       4.2.4 파일 형식에 따른 판단

4.3 다조건 판단 && || 

5. 프로세스 제어

5.1 판단하는 경우

5.1.1 단일 분기

5.1.2 다중 분기

5.1.3 if에서 (( )) 사용

5.2 사례 진술

5.2.1 기본 구문

5.2.2 사례

5.3 for 루프

5.3.1

5.3.2 for in(for 루프 향상, 조금 더 사용)

5.3.3 $*와 $@의 차이점

5.4 while 루프

6. 읽기 읽기 콘솔 입력 읽기

일곱, 기능

7.1 시스템 기능

7.1.1 basename

7.1.2 주소

7.2 커스텀 함수

7.2.1 기본 구문

7.2.2 주의사항

7.2.3 사례

8. 포괄적인 애플리케이션 - 파일 아카이빙 실현

9. 정규 표현식 시작하기

9.1 정규 매칭

9.2 일반적으로 사용되는 특수 문자

9.2.1 ^

9.2.2 $

9.2.3.

9.2.4 *

9.2.5 문자 범위(대괄호): [ ]

9.2.6 \

9.3 운동, 휴대폰 번호 매칭

10. 텍스트 처리 도구

10.1 컷

10.1.1 기본 사용법

10.1.2 옵션 파라미터 설명

10.1.3 사례

10.2 멍하니

10.2.1 기본 사용법

10.2.2 옵션 파라미터 설명

10.2.3 사례

10.2.4 gawk의 내장 변수

10.2.5 사례

11. 요약


1. 쉘 스크립트 시작하기

쉘 스크립트는 일반적으로  #!/bin/bash 로 시작합니다    (파서 지정).

그리고 일반 스크립트 파일은  기본적으로 .sh 로 접미사가 붙습니다   (누구나 이렇게 사용합니다)

#   은 주석 기호입니다.

다음과 같이 출력 hello world! 스크립트:

helloworld.sh 

#!/bin/bash

echo "hello world!"

 

1.1 Shell 스크립트의 세 가지 실행 방법

1.1.1 bash 스크립트 상대 경로 또는 절대 경로 또는 sh 스크립트 상대 경로 또는 절대 경로

예를 들어:

bash + 스크립트의 절대 경로

ygt@YGT:~/share/knowledge$ bash /home/ygt/share/knowledge/Shell/helloworld.sh
hello world!
ygt@YGT:~/share/knowledge$

bash + 스크립트에 대한 상대 경로

ygt@YGT:~/share/knowledge/Shell$ bash ./helloworld.sh
hello world!
ygt@YGT:~/share/knowledge/Shell$

sh + 스크립트의 절대 경로

ygt@YGT:~/share/knowledge/Shell$ sh /home/ygt/share/knowledge/Shell/helloworld.sh
hello world!
ygt@YGT:~/share/knowledge/Shell$

sh + 스크립트에 대한 상대 경로

ygt@YGT:~/share/knowledge/Shell$ sh ./helloworld.sh
hello world!
ygt@YGT:~/share/knowledge/Shell$

1.1.2 스크립트를 실행할 스크립트의 절대경로 또는 상대경로를 직접 입력 (이렇게 스크립트는 실행권한 'x'가 있어야 함)

스크립트 실행 권한 부여: chmod +x helloworld.sh

경로를 기준으로 스크립트를 실행합니다.

ygt@YGT:~/share/knowledge/Shell$ ./helloworld.sh
hello world!
ygt@YGT:~/share/knowledge/Shell$

절대 경로 실행 스크립트:

ygt@YGT:~/share/knowledge/Shell$ /home/ygt/share/knowledge/Shell/helloworld.sh
hello world!
ygt@YGT:~/share/knowledge/Shell$

참고 : 스크립트를 실행하는 첫 번째 방법, 본질은 bash 파서가 스크립트 실행을 도와주기 때문에 실행 권한 'x'가 없어도 스크립트 자체를 실행할 수 있고, 스크립트를 실행하는 두 번째 방법, 본질은 스크립트는 자체적으로 실행되므로 실행 권한 'x'가 필요합니다.

3. '.' 또는 소스 사용

첫 번째 방법 유형으로

ygt@YGT:~/share/knowledge/Shell$ . helloworld.sh
hello world!
ygt@YGT:~/share/knowledge/Shell$
ygt@YGT:~/share/knowledge/Shell$ source helloworld.sh
hello world!
ygt@YGT:~/share/knowledge/Shell$

참고 : 첫 번째 방법과 두 번째 방법은 모두 현재 쉘에서 하위 쉘을 열어 스크립트 내용을 실행하고 스크립트 내용이 종료되면 하위 쉘이 닫히고 상위 쉘로 돌아가며 세 번째 방법은 현재 쉘에 있습니다. shell 서브쉘을 열지 않고 스크립트를 실행합니다.

하위 셸을 여는 것과 하위 셸을 열지 않는 것의 차이점은 하위 셸에 설정된 현재 변수와 같은 환경 변수의 상속 관계가 부모 셸에서는 보이지 않는다는 것입니다.


2. 변수

변수는 지역 변수와 전역 변수로 나뉘는데, 지역 변수는 이 셸에서만 사용할 수 있고, 전역 변수는 이 셸 또는 하위 셸에서 사용할 수 있습니다. (시스템에서 미리 정의한 변수는 전역 변수이고 사용자 지정 변수는 지역 변수입니다.) 

2.1 시스템 사전 정의 변수

일반적으로 사용되는 시스템 변수: $HOME, $PWD, $SHELL, $USER

echo 또는 printenv를 사용하여 변수의 값을 출력할 수 있습니다.

ygt@YGT:~/share/knowledge/Shell$ printenv HOME
/home/ygt
ygt@YGT:~/share/knowledge/Shell$
ygt@YGT:~/share/knowledge/Shell$ echo $HOME
/home/ygt
ygt@YGT:~/share/knowledge/Shell$

set을 사용하여    현재 쉘의 모든 변수를 볼 수  있습니다.

2.2 맞춤 변수

2.2.1 기본 구문

  • 변수 정의: 변수 이름 = 변수 값 =        기호 앞뒤에 공백이 없어야 합니다.
  • 변수 설정 해제: 변수 이름 설정 해제
  • 정적 변수(상수) 선언: 읽기 전용 변수 이름 = 변수 값        참고, 설정 해제할 수 없음

2.2.2 변수 정의 규칙

  • 변수 이름은 문자, 숫자, 밑줄로 구성할 수 있지만 숫자로 시작할 수 없으며 환경 변수 이름은 대문자로 하는 것이 좋습니다.
  • 등호 양쪽에 공백이 있을 수 없습니다.
  • bash에서 변수의 기본 유형은 문자열 유형이며 값으로 직접 조작할 수 없습니다.
  • 변수 값에 공백이 있으면 큰따옴표나 작은따옴표로 묶어야 합니다.

2.2.3 사례

        2.2.3.1 변수명 정의

ygt@YGT:~/share/knowledge/Shell$ name=hello
ygt@YGT:~/share/knowledge/Shell$ echo $name
hello
ygt@YGT:~/share/knowledge/Shell$

        2.2.3.2 변수 이름 재할당

ygt@YGT:~/share/knowledge/Shell$ name=world
ygt@YGT:~/share/knowledge/Shell$ echo $name
world
ygt@YGT:~/share/knowledge/Shell$

        2.2.3.3 실행 취소 변수 이름

ygt@YGT:~/share/knowledge/Shell$ unset name
ygt@YGT:~/share/knowledge/Shell$ echo $name

ygt@YGT:~/share/knowledge/Shell$

        2.2.3.4 정적 변수(상수) 나이 선언, 정적 변수는 수정할 수 없으며 설정을 해제할 수 없습니다.

ygt@YGT:~/share/knowledge/Shell$ readonly age=24
ygt@YGT:~/share/knowledge/Shell$ echo $age
24
ygt@YGT:~/share/knowledge/Shell$ age=25
-bash: age: 只读变量
ygt@YGT:~/share/knowledge/Shell$ unset age
-bash: unset: age: 无法取消设定: 只读 variable
ygt@YGT:~/share/knowledge/Shell$

        2.2.3.5 bash에서 변수의 기본 유형은 문자열 유형이며 직접적인 수치 연산을 수행할 수 없습니다.

ygt@YGT:~/share/knowledge/Shell$ sum=1+2
ygt@YGT:~/share/knowledge/Shell$ echo $sum
1+2
ygt@YGT:~/share/knowledge/Shell$

        2.2.3.6 변수 값에 공백이 있으면 큰따옴표 또는 작은따옴표로 묶어야 합니다.

ygt@YGT:~/share/knowledge/Shell$ name="hello world!"
ygt@YGT:~/share/knowledge/Shell$ echo $name
hello world!
ygt@YGT:~/share/knowledge/Shell$

위에서 만든 모든 변수는 지역 변수이며 이 셸에서만 사용할 수 있습니다!

        2.2.3.7 지역 변수를 다른 셸 프로그램에서 사용할 수 있는 전역 변수로 승격

                내보내기 변수 이름

ygt@YGT:~/share/knowledge/Shell$ export sum

                helloworld.sh 파일에 sum 값 출력

ygt@YGT:~/share/knowledge/Shell$ vim helloworld.sh


#!/bin/bash
echo "hello world!"
echo $sum


ygt@YGT:~/share/knowledge/Shell$ ./helloworld.sh
hello world!
1+2

하위 셸에서 상위 셸의 전역 변수를 수정하면 하위 셸에서만 효과를 볼 수 있지만 상위 셸에는 영향을 줄 수 없습니다 .

예를 들어 helloworld.sh 파일에서 sum의 값을 수정한 후 출력하여 효과를 확인하고 helloworld.sh 스크립트를 실행한 다음 echo $sum을 실행하여 sum의 값을 확인합니다.

#!/bin/bash

echo "hello world!"
echo $sum
sum=100
echo $sum
ygt@YGT:~/share/knowledge/Shell$ ./helloworld.sh
hello world!
1+2
100
ygt@YGT:~/share/knowledge/Shell$
ygt@YGT:~/share/knowledge/Shell$ echo $sum
1+2
ygt@YGT:~/share/knowledge/Shell$

합계 값이 수정되지 않았음을 알 수 있으며 여전히 1+2입니다.

하지만 '.'이나 소스를 이용해서 스크립트를 실행시키면 정상적으로 수정이 가능합니다!

ygt@YGT:~/share/knowledge/Shell$ . helloworld.sh
hello world!
1+2
100
ygt@YGT:~/share/knowledge/Shell$
ygt@YGT:~/share/knowledge/Shell$ echo $sum
100
ygt@YGT:~/share/knowledge/Shell$

두 개의 숫자를 추가하려면 대괄호( ) 또는 대괄호 [ ]를 사용할 수 있습니다!

ygt@YGT:~/share/knowledge/Shell$ age=$((1+2))
ygt@YGT:~/share/knowledge/Shell$ echo $age
3
ygt@YGT:~/share/knowledge/Shell$ age=$[2+3]
ygt@YGT:~/share/knowledge/Shell$ echo $age
5
ygt@YGT:~/share/knowledge/Shell$
ygt@YGT:~/share/knowledge/Shell$ a=10
ygt@YGT:~/share/knowledge/Shell$ b=20
ygt@YGT:~/share/knowledge/Shell$ age=$[a+b]
ygt@YGT:~/share/knowledge/Shell$ echo $age
30
ygt@YGT:~/share/knowledge/Shell$
ygt@YGT:~/share/knowledge/Shell$ age=$[a+10]
ygt@YGT:~/share/knowledge/Shell$ echo $age
20
ygt@YGT:~/share/knowledge/Shell$

2.3 특수 변수

a = 10 

변수 $a를 작은따옴표 ' '로 묶으면 쉘이 문자열 $a로 구문 분석하고 변수 $a를 큰따옴표 " "로 감싸면 쉘에서 변수 $a로 구문 분석합니다. 즉, 값 10을 가져옵니다.

2.3.1 $n

        $n (함수 설명: n은 숫자, $0은 스크립트 이름, $1-$9는 첫 번째부터 아홉 번째 매개변수를 나타내며 ${10}, ${와 같이 10개 이상의 매개변수를 중괄호로 묶어야 합니다. 11} 등)

예:

다음 내용으로 스크립트를 작성합니다.

#!/bin/bash

echo '以下为$n的用法'
echo "文件名:$0"
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "第三个参数:$3"
ygt@YGT:~/share/knowledge/Shell$ ./special.sh one 二 3
以下为$n的用法
文件名:./special.sh
第一个参数:one
第二个参数:二
第三个参数:3
ygt@YGT:~/share/knowledge/Shell$

2.3.2 $#

$# (함수 설명: 루프에서 자주 사용되는 모든 입력 매개변수의 개수를 얻어 매개변수의 개수가 맞는지 판단하고 스크립트의 견고성을 강화함)

예:

다음 내용으로 스크립트를 작성합니다.

#!/bin/bash

echo "参数个数:$#"
ygt@YGT:~/share/knowledge/Shell$ ./special.sh one 二 3
参数个数:3
ygt@YGT:~/share/knowledge/Shell$

2.3.3 $*

$* (기능 설명: 이 변수는 명령줄의 모든 매개변수를 나타내며, $*는 모든 매개변수를 전체로 간주합니다 .)

예:

다음 내용으로 스크립트를 작성합니다.

#!/bin/bash

echo '输出$*:'
echo $*
ygt@YGT:~/share/knowledge/Shell$ ./special.sh one 二 3
输出$*:
one 二 3
ygt@YGT:~/share/knowledge/Shell$

2.3.4 $@

$@ (함수 설명: 이 변수는 명령줄의 모든 매개변수를 나타내지만 $@는 각 매개변수를 다르게 취급합니다 .)

즉, $@가 가져오는 것은 모든 매개변수를 저장하는 목록이거나 모든 매개변수를 저장하는 배열이므로 for 루프를 사용하여 하나씩 트래버스하여 꺼낼 수 있습니다(트래버스 방법은 나중에 설명하겠습니다).

예:

다음 내용으로 스크립트를 작성합니다.

#!/bin/bash

echo '输出$@'
echo $@
ygt@YGT:~/share/knowledge/Shell$ ./special.sh one 二 3
输出$@
one 二 3
ygt@YGT:~/share/knowledge/Shell$

2.3.5$?

$? (함수 설명: 마지막으로 수행한 명령의 반환 상태. 이 변수의 값이 0이면 이전 명령이 올바르게 수행되었음을 증명하고, 이 변수의 값이 0이 아니면(구체적인 숫자는 명령에 의해 결정됨) 자체), 이전 명령이 잘못 실행되었음을 증명)

예:

helloworld.sh 스크립트가 성공적으로 실행되었는지 확인 

root@YGT:/home/ygt/share/knowledge/Shell# ./helloworld.sh
hello world!

100
root@YGT:/home/ygt/share/knowledge/Shell# echo $?
0
root@YGT:/home/ygt/share/knowledge/Shell#
root@YGT:/home/ygt/share/knowledge/Shell# ./helloworld1.sh
bash: ./helloworld1.sh: 没有那个文件或目录
root@YGT:/home/ygt/share/knowledge/Shell# echo $?
127
root@YGT:/home/ygt/share/knowledge/Shell#

3. 운영자

위에서 우리는 Shell이 ​​직접 계산을 수행할 수 없다는 것을 알고 있습니다.

Shell에는 "$((compression expression))" 또는 "$[compression expression]"의 두 가지 실행 방법이 있습니다.

예: 

root@YGT:/home/ygt/share/knowledge/Shell# a=$((10 + 20))
root@YGT:/home/ygt/share/knowledge/Shell# echo $a
30
root@YGT:/home/ygt/share/knowledge/Shell# a=$[10*20]
root@YGT:/home/ygt/share/knowledge/Shell# echo $a
200
root@YGT:/home/ygt/share/knowledge/Shell#
root@YGT:/home/ygt/share/knowledge/Shell# a=10
root@YGT:/home/ygt/share/knowledge/Shell# b=20
root@YGT:/home/ygt/share/knowledge/Shell#
root@YGT:/home/ygt/share/knowledge/Shell# c=$(($a + $b))
root@YGT:/home/ygt/share/knowledge/Shell# echo $c
30
root@YGT:/home/ygt/share/knowledge/Shell# a=$[$b + $c]
root@YGT:/home/ygt/share/knowledge/Shell# echo $a
50
root@YGT:/home/ygt/share/knowledge/Shell#

또는 c=$((a + b)) a=$[b + c] 이것도 가능합니다!

경우, 새로운 add.sh 파일을 생성하고 매개변수로 두 개의 숫자를 입력하고 추가 후 출력

#!/bin/bash

sum=$[$1+$2]

echo sum=$sum
root@YGT:/home/ygt/share/knowledge/Shell# ./add.sh 10 20
sum=30
root@YGT:/home/ygt/share/knowledge/Shell#

4. 조건 판단

4.1 기본 구문

        (1) 시험조건        

        (2).[조건] (조건 앞뒤에 공백이 있어야 함)

        ( 비교가 완료된 후 $?를 사용하여 결과를 확인합니다. 0은 일치(true)를 의미하고 1은 일치하지 않음(false)을 의미합니다 .)

 

4.2 공통 판정 조건

        4.2.1 문자열 비교        

                (참고: 문자열 간의 비교인 경우 등호 "="를 사용하여 같음을 판단하고 "!="를 사용하여 같지 않음을 판단합니다.)

                4.2.1.1   = 같음

ygt@YGT:~/share/knowledge/Shell$ a=hello
ygt@YGT:~/share/knowledge/Shell$
ygt@YGT:~/share/knowledge/Shell$ test $a = hello    # 注意,等号两边需要有空格
ygt@YGT:~/share/knowledge/Shell$ echo $?
0
ygt@YGT:~/share/knowledge/Shell$ test $a = Hello    # 注意,等号两边需要有空格
ygt@YGT:~/share/knowledge/Shell$ echo $?
1
ygt@YGT:~/share/knowledge/Shell$
ygt@YGT:~/share/knowledge/Shell$ a=hello
ygt@YGT:~/share/knowledge/Shell$ b=world
ygt@YGT:~/share/knowledge/Shell$
ygt@YGT:~/share/knowledge/Shell$ [ $a = $b ]    # 注意,[ ] 内部也需要有空格与条件分割
ygt@YGT:~/share/knowledge/Shell$ echo $?
1
ygt@YGT:~/share/knowledge/Shell$ b=hello
ygt@YGT:~/share/knowledge/Shell$ [ $a = $b ]    # 注意,[ ] 内部也需要有空格与条件分割
ygt@YGT:~/share/knowledge/Shell$ echo $?
0
ygt@YGT:~/share/knowledge/Shell$

        등호 양쪽에 공백이 없으면 셸이 이를 값으로 구문 분석하므로 결과는 0(참)이 되고, 조건에 아무것도 없으면 결과는 1(거짓)이 됩니다. , 다음과 같이:

ygt@YGT:~/share/knowledge/Shell$ a=hello
ygt@YGT:~/share/knowledge/Shell$ test $a=Hello
ygt@YGT:~/share/knowledge/Shell$ echo $?
0
ygt@YGT:~/share/knowledge/Shell$
ygt@YGT:~/share/knowledge/Shell$ a=hello
ygt@YGT:~/share/knowledge/Shell$ [ $a=hello ]
ygt@YGT:~/share/knowledge/Shell$ echo $?
0
ygt@YGT:~/share/knowledge/Shell$
ygt@YGT:~/share/knowledge/Shell$ [ sdfjogwoegjowg ]
ygt@YGT:~/share/knowledge/Shell$ echo $?
0
ygt@YGT:~/share/knowledge/Shell$
ygt@YGT:~/share/knowledge/Shell$ [ ]
ygt@YGT:~/share/knowledge/Shell$ echo $?
1
ygt@YGT:~/share/knowledge/Shell$

               4.2.1.2   != 같지 않음

ygt@YGT:~/share/knowledge/Shell$ a=hello
ygt@YGT:~/share/knowledge/Shell$ [ $a != hello ]
ygt@YGT:~/share/knowledge/Shell$ echo $?
1
ygt@YGT:~/share/knowledge/Shell$ [ $a != Hello ]
ygt@YGT:~/share/knowledge/Shell$ echo $?
0
ygt@YGT:~/share/knowledge/Shell$

         4.2.2  정수 간의 비교

-eq 같음 (같음)
- 이다 같지 않다
-lt 미만 (미만)
- 보다 작거나 같음(덜 같음)
-gt ~보다 큰
-ge 보다 크거나 같음
ygt@YGT:~$ a=10
ygt@YGT:~$ b=20
ygt@YGT:~$ [ $a -eq $b ]        # 判断10是否等于20
ygt@YGT:~$ echo $?
1
ygt@YGT:~$ [ $a -lt $b ]        # 判断10是否小于20
ygt@YGT:~$ echo $?
0
ygt@YGT:~$ [ 10 -ge 10 ]        # 判断10是否大于等于10
ygt@YGT:~$ echo $?
0
ygt@YGT:~$

        4.2.3 파일 권한으로 판단

-아르 자형 파일에 읽기 권한(읽기)이 있는지 확인
-w 파일에 쓰기 권한이 있는지 확인(쓰기)
-엑스 파일에 실행 권한이 있는지 확인(실행)
ygt@YGT:~$ touch test.txt
ygt@YGT:~$ ll
总用量 1
drwxr-xr-x 9 ygt  ygt      4096  6月  5 23:07 ./
drwxr-xr-x 3 root root     4096 11月 16  2022 ../
-rw-rw-r-- 1 ygt  ygt         0  6月  5 23:07 test.txt
ygt@YGT:~$
ygt@YGT:~$ [ -r test.txt ]        # 判断test.txt文件是否有读的权限
ygt@YGT:~$ echo $?
0
ygt@YGT:~$ [ -x test.txt ]        # 判断test.txt文件是否有执行的权限
ygt@YGT:~$ echo $?
1
ygt@YGT:~$

       4.2.4 파일 형식에 따른 판단

-이자형 파일이 존재하는지 확인(existence)
-에프 파일이 존재하고 일반 파일(파일)인지 확인
-디 파일이 존재하고 디렉토리(디렉토리)인지 확인
ygt@YGT:~$ ll
总用量 2
drwxr-xr-x 10 ygt  ygt      4096  6月  5 23:17 ./
drwxr-xr-x  3 root root     4096 11月 16  2022 ../
drwxrwxr-x  2 ygt  ygt      4096  6月  5 23:17 test/
-rw-rw-r--  1 ygt  ygt         0  6月  5 23:07 test.txt
ygt@YGT:~$
ygt@YGT:~$ [ -e test.txt ]
ygt@YGT:~$ echo $?
0
ygt@YGT:~$ [ -e test ]
ygt@YGT:~$ echo $?
0
ygt@YGT:~$ [ -f test ]
ygt@YGT:~$ echo $?
1
ygt@YGT:~$ [ -d test ]
ygt@YGT:~$ echo $?
0
ygt@YGT:~$ [ -f test.txt ]
ygt@YGT:~$ echo $?
0
ygt@YGT:~$

 

4.3 다조건 판단 && || 

다중 조건 판단(&&는 이전 명령이 성공적으로 실행된 경우에만 다음 명령이 실행됨을 나타냅니다. ||는 이전 명령이 실패한 후에만 다음 명령이 실행됨을 나타냅니다.)

단락 실행에도 사용할 수 있습니다!

ygt@YGT:~$ a=10
ygt@YGT:~$ [ $a -gt 5 ] && echo "$a > 5"
10 > 5
ygt@YGT:~$ [ $a -lt 5 ] || echo "$a 不小于 5"
10 不小于 5
ygt@YGT:~$
ygt@YGT:~$ [ $a -lt 20 ] && echo "$a < 20" || echo "$a >= 20"
10 < 20
ygt@YGT:~$
ygt@YGT:~$ a=30
ygt@YGT:~$ [ $a -lt 20 ] && echo "$a < 20" || echo "$a >= 20"
30 >= 20
ygt@YGT:~$

명령에서도 사용할 수 있습니다!

ygt@YGT:~$ ls || ll
5       test          test.txt
ygt@YGT:~$

ls 명령이 성공적으로 실행 되면 후속 ll 명령이 실행되지 않습니다!


5. 프로세스 제어

흐름 제어는 if, case, for, while과 같은 모든 프로그램에서 매우 중요합니다.

5.1 판단하는 경우

5.1.1 단일 분기

if [ 条件判断式 ]; then    # 注意,这里的 ; 是有的
程序
fi

或者

if [ 条件判断式 ]
then
程序
fi

새 파일을 만들고 다음 내용을 작성합니다. (10보다 작은지 여부를 판별하려면 정수를 입력하십시오.)

#!/bin/bash

if [ $1 -lt 10 ]; then
        echo "$1 < 10"
fi

if [ "$2"x = "abc"x ]    # 特殊用法,即使没有参数2,也可以正常运行
then
        echo "相等"
fi
ygt@YGT:~/share/knowledge/Shell$ ./process.sh 5
5 < 10

물론 && 또는 ||를 사용하여 여러 조건을 판단할 수도 있습니다.

ygt@YGT:~/share/knowledge/Shell$ a=20
ygt@YGT:~/share/knowledge/Shell$ if [ $a -gt 18 ] && [ $a -lt 40 ]; then echo OK; fi
OK

&& 및 || 는 -a-o 로 대체할 수 있으며 조건은 [];(-a는 다음과 같고 -o는 or와 같음)로 작성할 수 있습니다. 

ygt@YGT:~/share/knowledge/Shell$ a=20
ygt@YGT:~/share/knowledge/Shell$ if [ $a -gt 18 -a $a -lt 40 ]; then echo OK; fi
OK

5.1.2 다중 분기

if [ 条件判断式 ]; then
程序
elif [ 条件判断式 ]; then
程序
else
程序
fi

다음 내용으로 새 파일을 만듭니다. 

#!/bin/bash

if [ $1 -lt 18 ]; then
	echo "未成年"
else
	echo "已成年"
fi


if [ $2 -ge 0 -a $2 -lt 60 ]; then
	echo "不及格"
elif [ $2 -ge 60 -a $2 -le 90 ]; then
	echo "及格"
elif [ $2 -gt 90 -a $2 -le 100 ]; then
	echo "优秀"
else
	echo  "成绩有误"
fi
[centos7@localhost Shell]$ ./process.sh 24 70
已成年
及格
[centos7@localhost Shell]$ ./process.sh 16 -1
未成年
成绩有误
[centos7@localhost Shell]$ 

5.1.3 if에서 (( )) 사용

(( ))를 사용하여 괄호 안에 C와 같은 사용법을 사용합니다. 물론 일반적으로 이 방법을 사용하는 것은 권장되지 않습니다!

ygt@YGT:~/share/knowledge/Shell$ a=10
ygt@YGT:~/share/knowledge/Shell$ if (( $a > 20 )); then echo OK; else echo notOK; fi
notOK

5.2 사례 진술

5.2.1 기본 구문

case $变量名 in
"值 1")
如果变量的值等于值 1,则执行程序 1
;;
"值 2")
如果变量的值等于值 2,则执行程序 2
;;
*)
如果变量的值都不是以上的值,则执行此程序(defualt)
;;
esac

지침:

  • 대소문자 줄은 "in"이라는 단어로 끝나야 하며 각 패턴 일치는 닫는 대괄호 ")"로 끝나야 합니다.
  • 이중 세미콜론 ";;"은 명령 시퀀스의 끝을 나타내며 이는 C/C++에서 break와 동일합니다.
  • 마지막 "*)"는 기본 모드를 나타내며 C/C++의 기본값과 동일합니다.

주로 위의 구문은 다르며 다른 사용법은 C/C++ 스위치 케이스 사용법과 일치합니다.

5.2.2 사례

다음 내용으로 새 파일을 만듭니다. 

#!/bin/bash

case $1 in
"1")
	echo "one"
;;
"2")	
    echo "two"
;;
"3")	
    echo "three"
;;
*)
	echo "other"
;;
esac
[centos7@localhost Shell]$ ./process_case.sh 2
two

 

5.3 for 루프

for 루프에는 for와 for in의 두 가지 유형이 있습니다.

5.3.1

 (( ))를 사용하여 괄호 안에 C와 같은 사용법을 사용합니다. for 루프는 다음과 같이 사용할 수 있습니다!

for (( 初始值; 循环控制条件; 变量变化 ))
do
程序
done

새 파일을 만들고 다음을 작성합니다. (1+...+n 계산)

#!/bin/bash

sum=0

for (( i=1; i <= $1; i++ )); do
        sum=$[ $sum + $i ]
        #sum=$[ sum + i ]    # 貌似这样写也是可以的
        #sum=$((sum + i))    # 貌似这样写也是可以的  
        #let sum=sum+i 
done

echo "sum = $sum"

Linux Shell 업데이트로 let 키워드를 사용하여   현재 고급 언어 사용을 구현할 수 있습니다. 

예: let sum=sum+i let sum++ 등.

ygt@YGT:~/share/knowledge/Shell$ ./sum.sh 10
sum = 55

5.3.2 for in(for 루프 향상, 조금 더 사용)

for 变量 in 值 1 值 2 值 3…
do
程序    # 变量 的取值为 in 后面的值
done
#!/bin/bash

for os in Linux Windows Macos; do
        echo $os;
done
ygt@YGT:~/share/knowledge/Shell$ ./sum.sh
Linux
Windows
Macos
ygt@YGT:~/share/knowledge/Shell$

물론 { .. }로 래핑된 컬렉션을 제공할 수도 있습니다. 예를 들면 다음과 같습니다.

ygt@YGT:~/share/knowledge/Shell$ for i in {1..100}; do sum=$[ $sum + $i ]; done; echo "sum = $sum"
sum = 5050
ygt@YGT:~/share/knowledge/Shell$

5.3.3 $*와 $@의 차이점

$*와 $@는 모두 함수나 스크립트에 전달되는 모든 매개변수를 나타내며 큰따옴표 ""로 포함되지 않은 경우 모든 매개변수는 $1 $2 ... $n 형식으로 출력됩니다. 

 $*: 매개변수를 전체적으로 취급합니다.

$@: 매개변수를 독립적인 개인으로 취급

다음 내용으로 새 파일을 만듭니다.

(코드에서 $*와 $@를 큰따옴표로 묶지 않으면 동일한 효과를 얻을 수 있으며 차이점을 볼 수 없습니다.)

#!/bin/bash

echo '$*:'
for pro in "$*"; do     # 注意这里$*一定要用双引号括起来,就可以看出其将参数看作是一个整体
        echo $pro
done

echo '$@:'
for pro in "$@"; do     # 注意这里$@一定要用双引号括起来,就可以看出其将参数看作是分开的独立个体
        echo $pro
done
ygt@YGT:~/share/knowledge/Shell$ ./process_for.sh 1 2 3 a b c
$*:
1 2 3 a b c
$@:
1
2
3
a
b
c
ygt@YGT:~/share/knowledge/Shell$

$*는 매개변수를 문자열 전체로 간주하고 $@는 매개변수를 독립적인 개별 개체로 간주합니다.

5.4 while 루프

while [ 条件判断式 ]
do
程序
done
#!/bin/bash

i=1
sum=0

#while (( i <= $1 )); do        # 也可以使用 (( )) 替代[ ]
while [ $i -le $1 ]; do
        sum=$[ $sum + $i ]
        i=$[ $i + 1 ]
        #let sum=sum+i
        #let i++
done

echo "sum = $sum"

( let 키워드를 사용하여 고급 언어의 사용법을 수정할 수 있습니다!) 

코드에서 (( ))와 [ ]는 서로 바꿔서 사용할 수 있습니다!

일반적으로 while은 []를 사용합니다.

ygt@YGT:~/share/knowledge/Shell$ ./process_while.sh 100
sum = 5050

6. 읽기 읽기 콘솔 입력 읽기

읽기(옵션)(인수)

①옵션:

        -p: 값을 읽을 때 프롬프트를 지정합니다.

        -t : 값을 읽을 때의 대기 시간(초) 지정 -t를 추가하지 않으면 항상 대기한다는 의미

                (-t 시간이 추가된 후 읽기 작업이 종료되고 계속 실행됨)

② 매개변수

        변수: 값을 읽을 변수 이름을 지정합니다.

다음 내용으로 새 파일을 만듭니다. 

#!/bin/bash

read -t 7 -p "请输入您的名字:" name

#if [ "$name" == "" ]; then
if [ ! $name ]; then
        echo "Name is NULL"
else
        echo "Your name is $name"
fi
ygt@YGT:~/share/knowledge/Shell$ ./process_read.sh
请输入您的名字:李华
Your name is 李华
ygt@YGT:~/share/knowledge/Shell$ ./process_read.sh
请输入您的名字:Name is NULL
ygt@YGT:~/share/knowledge/Shell$

일곱, 기능

소문자, 스플라이스 파일 이름(날짜 함수), 형식: 파일 이름_log_timestamp

#!/bin/bash

filename="$1"_log_$(date +%s)
echo $filename

date는 시스템 함수이고, +%s는 타임스탬프를 가져오고 반환하기 위해 전달된 매개변수입니다. 

ygt@YGT:~/share/knowledge/Shell$ ./date.sh test
test_log_1686280637
ygt@YGT:~/share/knowledge/Shell$

시스템 함수 호출 방법: $(system function) 일명: 명령 대체

 

7.1 시스템 기능

다음은 일반적으로 사용되는 두 가지 시스템 기능인 basename과 dirname입니다.

7.1.1 basename

        7.1.1.1 기본 구문

                기본 이름 [문자열 / 경로 이름] [접미사]

                (기능 설명: basename 명령은 마지막('/') 문자를 포함한 모든 접두사를 삭제한 다음 문자열을 표시합니다.

                basename은 경로에서 파일 이름을 취하는 것으로 이해할 수 있습니다.

                옵션: suffix는 접미사이며, suffix가 지정된 경우 basename은 경로 이름 또는 문자열에서 접미사를 제거합니다.

기본 이름은 /!가 있는 문자열만 가로챌 수 있습니다.

        7.1.1.2 사례

ygt@YGT:~/share/knowledge/Shell$ basename /home/ygt/share/knowledge/Shell/date.sh
date.sh
ygt@YGT:~/share/knowledge/Shell$ basename /home/ygt/share/knowledge/Shell/date.sh .sh
date
ygt@YGT:~/share/knowledge/Shell$ basename ./date.sh
date.sh
ygt@YGT:~/share/knowledge/Shell$ basename /abcsdf/asdgwr/erg43
erg43

7.1.2 주소

        7.1.2.1 기본 구문

                dirname 파일 절대 경로

                 (함수 설명: 주어진 절대경로가 포함된 파일명에서 파일명(비디렉토리 부분)을 제거한 후, 나머지 경로(디렉토리 부분)를 반환)

                 dirname은 파일 경로의 절대 경로 이름으로 이해할 수 있습니다.

       7.1.2.2 사례

ygt@YGT:~/share/knowledge/Shell$ dirname /home/ygt/share/knowledge/Shell/date.sh
/home/ygt/share/knowledge/Shell
ygt@YGT:~/share/knowledge/Shell$ dirname ./date.sh
.
ygt@YGT:~/share/knowledge/Shell$ dirname /sadfsg/gwgwrga/agwgg
/sadfsg/gwgwrga

또한 임의의 경로에서 스크립트를 호출하고 스크립트가 있는 전체 경로를 출력하는 더 흥미로운 방법이 있습니다.

#!/bin/bash

echo $(cd $(dirname $0); pwd)
ygt@YGT:~/share/knowledge/Shell$ ./date.sh
/home/ygt/share/knowledge/Shell

ygt@YGT:~/share/knowledge/Shell$ cd /
ygt@YGT:/$ /home/ygt/share/knowledge/Shell/date.sh
/home/ygt/share/knowledge/Shell

ygt@YGT:/$ cd /home/ygt/share/knowledge/shared_bike/src/
ygt@YGT:~/share/knowledge/shared_bike/src$ ../../Shell/date.sh
/home/ygt/share/knowledge/Shell

 

7.2 커스텀 함수

7.2.1 기본 구문

[ function ] funname [()]
{
    Action;
    [return int;]
}

7.2.2 주의사항

  • 함수는 함수를 호출하기 전에 선언해야 하며 쉘 스크립트는 한 줄씩 실행됩니다. 다른 언어처럼 먼저 컴파일하지 않습니다.
  • 함수의 반환 값은 표시 및 추가할 수 있는 $?시스템 변수를 통해서만 얻을 수 있습니다: 반환 반환, 추가하지 않으면 마지막 명령의 결과가 반환 값으로 사용됩니다. 값 n(0-255)이 뒤따르는 반환;
  • $?를 통해 얻은 반환 값은 0-255 사이만 가능하므로 echo를 사용하여 데이터를 출력한 다음 $()를 사용하여 함수를 호출하면 echo 출력 결과를 얻을 수 있습니다. 함수의 반환 값;
  • 함수를 정의할 때 매개변수를 지정할 필요가 없으며, 함수 호출 시 매개변수를 직접 전달하고 $1, $2...$n은 매개변수 값을 얻기 위해 함수 내부에서 사용합니다! 

7.2.3 사례

다음 내용으로 새 파일을 만듭니다.

#!/bin/bash

function add() {
        s=$[ $1 + $2 ]
        return $s       # 注意,只能返回0-255之间的数
}

read -p "请输入第一个整数:" a
read -p "请输入第二个整数:" b

add $a $b
echo "$a + $b = $?"
ygt@YGT:~/share/knowledge/Shell$ ./func.sh
请输入第一个整数:10
请输入第二个整数:20
10 + 20 = 30
ygt@YGT:~/share/knowledge/Shell$ ./func.sh
请输入第一个整数:100
请输入第二个整数:200
100 + 200 = 44
ygt@YGT:~/share/knowledge/Shell$

$?는 0-255 사이의 값만 가져올 수 있으므로 초과하면 올바른 값을 반환할 수 없습니다.

이러한 문제를 해결하기 위해 echo를 사용하여 값을 출력한 다음 $()를 사용하여 함수를 호출하여 수신할 수 있습니다.

#!/bin/bash

function add() {
        s=$[ $1 + $2 ]    # s=$(( $1 + $2 ))
        echo $s
}

read -p "请输入第一个整数:" a
read -p "请输入第二个整数:" b

sum=$( add $a $b )
echo "$a + $b = $sum"
ygt@YGT:~/share/knowledge/Shell$ ./func.sh
请输入第一个整数:100
请输入第二个整数:200
100 + 200 = 300

함수에 여러 개의 에코 출력이 있는 경우 함수가 호출된 위치에서 마지막 에코 출력의 값만 얻을 수 있습니다!


8. 포괄적인 애플리케이션 - 파일 아카이빙 실현

이것은 파일 보관 작업을 실현하기 위해 위의 처음 7개 장의 지식 포인트를 포괄적으로 적용한 것입니다!

실제 프로덕션 애플리케이션에서는 중요한 데이터를 보관하고 백업해야 하는 경우가 많습니다.

요구 사항 : 지정된 디렉토리를 매일 아카이브 및 백업하는 스크립트를 구현하고, 디렉토리 이름을 입력하고(끝에 / 없이) 디렉토리에 있는 모든 파일을 일별로 아카이브 및 저장하고, 아카이브 파일 이름에 아카이브 날짜를 추가하고, /hong/ ygt에 넣으십시오.

아카이브 명령은 여기에서 사용됩니다: tar

나중에 -c 옵션을 추가하여 아카이브를 표시하고 -z 옵션을 추가하여 동시 압축을 표시할 수 있으며 결과 파일 확장자는 .tar.gz입니다.

스크립트는 다음과 같이 구현됩니다.

#!/bin/bash

# 首先判断输入的参数个数是否为1
if [ $# -ne 1 ]; then
        echo "参数个数错误!应输入一个参数,作为归档目录名"
        exit
fi

# 从参数中获取目录名称
if [ -d $1 ]; then
        echo
else
        echo
        echo "目录不存在!"
        echo
        exit
fi

DIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1); pwd)

# 获取当前日期
DATE=$(date +%y%m%d)

# 定义生成的归档文件名
FILE=Shell_${DIR_NAME}_${DATE}.tar.gz
DEST=/home/ygt/$FILE

# 开始归档目录文件
echo "开始归档..."
echo

tar -zcf $DEST $DIR_PATH/$DIR_NAME

if [ $? -eq 0 ]; then
        echo
        echo "归档成功!"
        echo "归档文件为:$DEST"
        echo
else
        echo "归档失败!"
        echo
fi


9. 정규 표현식 시작하기

정규식은 단일 문자열을 사용하여 특정 문법 규칙을 충족하는 일련의 문자열을 설명하고 일치시킵니다. 많은 텍스트 편집기에서 정규식은 일반적으로 특정 패턴과 일치하는 텍스트를 검색하고 바꾸는 데 사용됩니다. Linux에서 grep, sed 및 awk와 같은 텍스트 처리 도구는 모두 정규식을 통한 패턴 일치를 지원합니다.

 

9.1 정규 매칭

특수 문자를 포함하지 않는 정규식 문자열은 다음과 같이 자체적으로 일치합니다.

ygt@YGT:~/share/knowledge/Shell$ cat archive.sh | grep DATE
DATE=$(date +%y%m%d)
FILE=Shell_${DIR_NAME}_${DATE}.tar.gz

DATE가 포함된 행을 일치시킬 수 있습니다!

 

9.2 일반적으로 사용되는 특수 문자

9.2.1     ^

^는   줄의 시작과 일치합니다. 예를 들면 다음과 같습니다.

ygt@YGT:~/share/knowledge/Shell$ cat archive.sh | grep ^i
if [ $# -ne 1 ]; then
if [ -d $1 ]; then
if [ $? -eq 0 ]; then
ygt@YGT:~/share/knowledge/Shell$

9.2.2     $

$는   줄의 끝과 일치합니다. 예를 들면 다음과 같습니다.

ygt@YGT:~/share/knowledge/Shell$ cat archive.sh | grep gz$
FILE=Shell_${DIR_NAME}_${DATE}.tar.gz
ygt@YGT:~/share/knowledge/Shell$

9.2.3    .

.   는 임의의 문자와 일치합니다. 예를 들면 다음과 같습니다.

ygt@YGT:~/share/knowledge/Shell$ cat archive.sh | grep h.me
DEST=/home/ygt/$FILE
ygt@YGT:~/share/knowledge/Shell$
ygt@YGT:~/share/knowledge/Shell$ cat archive.sh | grep h...
if [ $# -ne 1 ]; then
        echo "参数个数错误!应输入一个参数,作为归档目录名"
        echo "目录不存在!"
FILE=Shell_${DIR_NAME}_${DATE}.tar.gz
DEST=/home/ygt/$FILE
echo "开始归档..."
        echo "归档成功!"
        echo "归档文件为:$DEST"
        echo "归档失败!"
ygt@YGT:~/share/knowledge/Shell$

9.2.4    *

* 는 단독으로 사용되지 않고 이전 문자와 함께 사용됩니다. 즉, 이전 문자와 0번 이상 일치한다는 의미입니다. 예를 들면 다음과 같습니다.

ygt@YGT:~/share/knowledge/Shell$ cat /etc/passwd | grep ro*t
root:x:0:0:root:/root:/bin/bash
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
ygt@YGT:~/share/knowledge/Shell$

rt, rot, root, rooot, roooot 등과 같은 모든 줄과 일치합니다.

  1번 또는 n번 일치하는 + 도 있습니다 . 0번 또는 1번 일치!

추가로: .*를   조합하여 사용하면 임의의 수의 문자와 일치합니다!

9.2.5 문자 범위(대괄호): [ ]

[ ]는 특정 범위 내의 문자와 일치함을 의미합니다. 예를 들면 다음과 같습니다.

        [6,8] —— 6 또는 8과 일치 [0-9]------0-9의 숫자와 일치;

        [0-9]* —— 모든 길이의 숫자 문자열과 일치합니다.

        [az] - az 사이의 문자를 일치시킵니다.

        [az]* —— 모든 길이의 알파벳 문자열과 일치합니다.

        [ac, ef] - ac 또는 ef 사이의 모든 문자와 일치합니다.

ygt@YGT:~/share/knowledge/Shell$ echo "541rooabcbbat" | grep r[o,a,b,c]*t
541rooabcbbat
ygt@YGT:~/share/knowledge/Shell$
ygt@YGT:~/share/knowledge/Shell$ cat /etc/passwd | grep r[a-z]*t
root:x:0:0:root:/root:/bin/bash
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
ygt@YGT:~/share/knowledge/Shell$

9.2.6    \

\는  이스케이프를 의미하며 단독으로 사용되지 않습니다. 모든 특수 문자에는 고유한 일치 패턴이 있으므로 특수 문자 자체를 일치시키려는 경우(예를 들어 '$'가 포함된 모든 줄을 찾고자 하는 경우) 어려움에 직면하게 됩니다. 이 시점에서 이스케이프 문자와 특수 문자를 함께 사용하여 특수 문자 자체를 나타내야 합니다. 예를 들면 다음과 같습니다.

ygt@YGT:~/share/knowledge/Shell$ cat archive.sh | grep '\$'
if [ $# -ne 1 ]; then
if [ -d $1 ]; then
DIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1); pwd)
DATE=$(date +%y%m%d)
FILE=Shell_${DIR_NAME}_${DATE}.tar.gz
DEST=/home/ygt/$FILE
tar -zcf $DEST $DIR_PATH/$DIR_NAME
if [ $? -eq 0 ]; then
        echo "归档文件为:$DEST"
ygt@YGT:~/share/knowledge/Shell$
ygt@YGT:~/share/knowledge/Shell$ cat archive.sh | grep '/\$'
DEST=/home/ygt/$FILE
tar -zcf $DEST $DIR_PATH/$DIR_NAME
ygt@YGT:~/share/knowledge/Shell$

$!가 포함된 줄을 일치시킬 수 있습니다. /$!가 포함된 줄을 일치시킬 수 있습니다.

 

9.3 운동, 휴대폰 번호 매칭

ygt@YGT:~/share/knowledge/Shell$ echo "15712345678" | grep ^1[3,4,5,7,8][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]&
ygt@YGT:~/share/knowledge/Shell$ 15712345678
ygt@YGT:~/share/knowledge/Shell$
ygt@YGT:~/share/knowledge/Shell$ echo "15712345678" | grep -E ^1[3,4,5,7,8][0-9]{9}&                                                                                                  
ygt@YGT:~/share/knowledge/Shell$ 15712345678

이 외에도 여기서 소개하지 않은 정규표현식의 고급 사용법이 많이 있는데 나중에 시간이 나면 추가하도록 하겠습니다!


10. 텍스트 처리 도구

10.1 컷

잘라내기 작업은 "자르기"이며, 특히 파일의 데이터를 잘라내는 역할을 합니다. cut 명령은 파일의 각 행에서 바이트, 문자 및 필드를 잘라내어 이러한 바이트, 문자 및 필드를 출력합니다.

10.1.1 기본 사용법

        cut [옵션 매개변수] 파일명

        설명: 기본 구분 기호는 탭입니다.

10.1.2 옵션 파라미터 설명

옵션 매개변수 기능
-에프 열 번호, 추출할 열
-디 구분 기호, 지정된 구분 기호에 따라 열을 분할합니다. 기본값은 탭 문자 "\t"입니다.
-씨 문자로 자른 후 n을 추가하여 -c 1과 같이 사용할 열을 나타냅니다.

10.1.3 사례

10.1.3.1 데이터 준비

ygt@YGT:~/share/knowledge/Shell$ vim cut.txt
ygt@YGT:~/share/knowledge/Shell$ cat cut.txt
guang shen dong
zhou zhen guan
wo wo wo
lai lai lai
le le le

10.1.3.2 공백으로 분할하여 첫 번째 열 가져오기

ygt@YGT:~/share/knowledge/Shell$ cut -d " " -f 1 cut.txt
guang
zhou
wo
lai
le

10.1.3.3 두 번째 및 세 번째 열을 얻기 위해 공백으로 분할

ygt@YGT:~/share/knowledge/Shell$ cut -d " " -f 2,3 cut.txt
shen dong
zhen guan
wo wo
lai lai
le le

10.1.3.4 cut.txt 파일에서 guang 잘라내기

ygt@YGT:~/share/knowledge/Shell$ cat cut.txt | grep guang | cut -d " " -f 1
guang

10.1.3.5 /etc/passwd 파일의 사용자, 경로 및 bash를 잘라냅니다.

ygt@YGT:~/share/knowledge/Shell$ cat /etc/passwd | grep bash$
root:x:0:0:root:/root:/bin/bash
ygt:x:1000:1000:ygt,,,:/home/ygt:/bin/bash
ygt@YGT:~/share/knowledge/Shell$
ygt@YGT:~/share/knowledge/Shell$ cat /etc/passwd | grep bash$ | cut -d ":" -f 1,5,7
root:root:/bin/bash
ygt:ygt,,,:/bin/bash
ygt@YGT:~/share/knowledge/Shell$

10.1.3.6 열 범위 가로채기

cat /etc/passwd | grep bash$ | cut -d ":" -f 2-4
cat /etc/passwd | grep bash$ | cut -d ":" -f -4
cat /etc/passwd | grep bash$ | cut -d ":" -f 3-

10.1.3.7 IP 주소 가로채기

ygt@YGT:~/share/knowledge/Shell$ ifconfig | grep "广播"
          inet 地址:192.168.160.128  广播:192.168.160.255  掩码:255.255.255.0
ygt@YGT:~/share/knowledge/Shell$
ygt@YGT:~/share/knowledge/Shell$ ifconfig | grep "广播" | cut -d " " -f 12 | cut -d ":" -f 2
192.168.160.128
ygt@YGT:~/share/knowledge/Shell$

 

10.2 멍하니

파일을 한 줄씩 읽고 기본 구분 기호로 공백을 사용하여 각 줄을 슬라이스한 다음 잘린 부분을 분석하는 강력한 텍스트 분석 도구입니다.

10.2.1 기본 사용법

gawk [옵션 매개변수] '/pattern1/{action1} /pattern2/{action2}...' 파일명

패턴: 일치하는 패턴인 데이터에서 gawk가 찾고 있는 것을 나타냅니다.

action: 일치 항목이 발견될 때 실행할 일련의 명령입니다.

10.2.2 옵션 파라미터 설명

옵션 매개변수 기능
-에프 입력 파일 구분자 지정
-V 사용자 정의 변수에 값 할당

10.2.3 사례

참고: 패턴과 일치하는 줄만 작업을 실행합니다.

10.2.3.1 /etc/passwd 파일에서 루트 키워드로 시작하는 모든 줄을 검색하고 줄의 7열을 출력합니다.

ygt@YGT:~$ cat /etc/passwd | gawk -F ":" '/^root/{print $7}'
/bin/bash

10.2.3.2 /etc/passwd 파일에서 root 키워드로 시작하는 모든 행을 검색하고 ","로 구분된 행의 첫 번째 및 일곱 번째 열을 출력합니다.

ygt@YGT:~$ cat /etc/passwd | gawk -F ":" '/^root/{print $1","$7}'
root,/bin/bash

10.2.3.3 /etc/passwd의 첫 번째와 일곱 번째 열만 쉼표로 구분하여 표시하고 모든 줄 앞에 열 이름 user 및 shell을 추가하고 마지막 줄에 "end!!!"를 추가합니다.

ygt@YGT:~$ cat /etc/passwd | gawk -F ":" 'BEGIN{print "user, shell"}/bash$/{print $1","$7} END{print "end!!!"}'
user, shell
root,/bin/bash
ygt,/bin/bash
end!!!
ygt@YGT:~$

참고: BEGIN은 모든 데이터 읽기 행 전에 실행되고 END는 모든 데이터가 실행된 후에 실행됩니다.

10.2.3.4 /etc/passwd 파일에서 사용자 ID를 1씩 늘리고 출력

cat /etc/passwd | gawk -F ":" '{print $3}'             # 这是没有+1的
cat /etc/passwd | gawk -v i=1 -F ":" '{print $3+i}'    # 这是有+1的

10.2.4 gawk의 내장 변수

변하기 쉬운 설명하다
파일 이름 파일 이름
NR 읽은 레코드 수(행 번호)
NF 찾아보기 레코드의 도메인 수(잘라낸 후 열 수)

10.2.5 사례

10.2.5.1 통계 /etc/passwd 파일명, 각 행의 줄 번호, 각 행의 열 수

ygt@YGT:~$ gawk -F : '{print "文件名:"FILENAME", 行号:"NR", 列号:"NF}' /etc/passwd
文件名:/etc/passwd, 行号:1, 列号:7
文件名:/etc/passwd, 行号:2, 列号:7
文件名:/etc/passwd, 行号:3, 列号:7
# 。。。中间省略。。。
文件名:/etc/passwd, 行号:24, 列号:7
文件名:/etc/passwd, 行号:25, 列号:7

10.2.5.2 ifconfig 명령의 출력 결과에서 빈 줄의 줄 번호 쿼리

ygt@YGT:~$ ifconfig | gawk '/^$/ {print "空行:"NR}'
空行:9
空行:18
ygt@YGT:~$

11. 요약

지금까지 Linux Shell의 기본 입문 튜토리얼이 완료되었습니다!

큰 지식 포인트는 없지만 이것들을 배우고 나면 일상 업무에 대처하기에 충분합니다!

또한 이 튜토리얼은 Bilibili에서 "Silicon Valley"의 비디오를 보고 배운 것입니다!

추천

출처blog.csdn.net/cpp_learner/article/details/131047527