bash 셸 학습 기록 (1)

1. bash 셸 이 무엇 입 니까?
Liux 커 널 에 서 는 어떤 버 전의 Liux 발행 판 이 든 다음 셸 지원 이 있 습 니 다.BASH, CSH, TCSH, ZSH, SCSH. 이 셸 들 은 모두 최초의 셸 에서 발 전 된 것 이다.너 는 아래 의 구조 도 를 참고 하여 이해 할 수 있다.
USER Request
Shell
Linux kernal
Computer hardware
Application
위의 관계 도 를 통 해 알 수 있 듯 이 셸 은 사용자 의 수요 와 Liux 커 널 간 의 전환 미디어 입 니 다. 사용 자 는 Liux 시스템 이 사용자 의 수 요 를 처리 하기 위해 특정한 임 무 를 완성 할 수 있 습 니 다. 사용 자 는 셸 을 작성 할 수 있 습 니 다. 셸 프로그램 을 실행 하면 Liux 커 널 과 컴퓨터 의 바 텀 하드웨어 간 에 양 방향 상호작용 이 존재 합 니 다.하드웨어 를 제어 하 는 기능 을 실현 한다.셸 언어 는 명령 행 언어의 상호작용 이다.
2, CLI (commond line interface), 명령 행 상호작용
셸 언어 는 Liux 커 널 과 의 상호작용 을 제공 합 니 다. 그러면 우 리 는 명령 행 을 통 해 명령 을 입력 하면 Liux 와 의 상호작용 을 실현 할 수 있 습 니 다.
2.1 현재 셸 형식 을 어떻게 찾 습 니까?
$ cat /etc/shells
>>
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/bin/rbash
/bin/dash
/usr/bin/tmux

저 는 ubuntu 시스템 을 사용 하고 tmux 도 구 를 설 치 했 기 때문에 / usr / bin / tmux 가 있 습 니 다.너 는 없 을 수도 있다. 여 기 는 모든 사람의 상황 이 다 를 수도 있다.당시 에 배 운 것 은 bash 였 는데, bash 를 지지 하면 된다.
2.2 기본 명령 행 단축 키
단축 키
속뜻
CTRL-L
명령 창 지우 기
CTRL-W
현재 명령 줄 의 커서 가 있 는 위 치 를 삭제 하 는 단어
CTRL-U
현재 명령 줄 의 모든 내용 삭제
CTRL-R
이전에 사 용 했 던 명령 을 검색 합 니 다.
CTRL-C
현재 실행 중인 명령 취소
예 를 들 어 명령 행 에 date 명령 을 입력 할 수 있 습 니 다.
$ date
>>
2018  11  26      09:16:14 CST

단축 키 CTRL + L 을 입력 하면 명령 창 이 비 워 집 니 다!너 는 위의 표 의 명령 의 미 를 끊임없이 이해 하려 고 시도 할 수 있다.
2.3, Liux 에서 명령 의 도움 을 받 습 니 다.
만약 당신 이 python 을 사용 한 적 이 있다 면, matlab 는 help 가 무엇 인지 잘 이해 할 것 입 니 다.* * 특정한 함수 나 키워드 * * 의 의 미 를 모 르 거나 어떻게 사용 하 는 지 모 를 때 help 등 명령 을 사용 할 수 있 습 니 다. Liux 에서 명령 행 에서 다음 과 같은 세 가지 방식 으로 특정한 명령 의 의미 와 사용 방식 을 볼 수 있 습 니 다.
man date
info date
date --help

3. 셸 프로 그래 밍 의 대체 적 인 절차 요약
3.1 type 명령
type 명령 은 내장 (build - in) 에 속 하 는 명령 인지, 외부 에 있 는 바 이 너 리 실행 가능 한 파일 인지 찾 는 데 사 용 됩 니 다. 예 를 들 어,
$ type -a ls
>>
ls is aliased to `ls --color=auto'
ls is /bin/ls
$ type -a date 
>>
date is hashed (/bin/date)
$ type -a history
>>
history is a shell builtin
$ type -a echo
>>
echo is a shell builtin
echo is /bin/echo

등등 명령 은 type 명령 으로 종 류 를 볼 수 있 습 니 다.여기, 이곳
#  -a,a  all   
$ type -a

3.2 시작 "Hello, world!"
  • 명령 행 을 열 고 ctrl + alt + t.
  • 배 운 bash 가 만 든 폴 더 에 들 어가 서 bash 파일 을 만 듭 니 다. 예 를 들 어 vim begin 00. sh 는 물론 접미사 이름. sh 가 꼭 필요 한 것 은 아 닙 니 다. 그 때 는 오 해 를 사지 않도록 구분 하기 위해 제 가 추 가 했 습 니 다.
  • 파일 첫 줄 에 입력 \ #! /bin/bash

  • 나 는 vim 편집 기 를 사용 하 는 것 에 비교적 익숙 하기 때문에, 나 는 항상 vim 를 사용 하여 파일 을 만 들 거나 열 것 이다. 물론, 너 는 gedit 등 다른 컴 파 일 러 를 사용 하여 같은 조작 을 할 수 있다.만약 당신 이 vim 을 공부 하고 싶다 면 이 두 문장 을 참고 할 수 있 습 니 다.
  • vim 설정
  • vim 에 대한 명령 조작
  • 본론 으로 돌아 가면, 너의 서 류 는 마 땅 히 이렇게 해 야 한다.bin / bash echo "Hello, world!" ` ` * * 첫 문장 에 대하 여 \ #! /빈 / bash, \ # 주석 입 니 다!특수 문자 로 컴 파일 러 에 게 아래 위치 에 대응 하 는 컴 파일 러 에 게 이 파일 의 모든 내용 을 설명 하 라 고 알려 줍 니 다.type 명령 을 통 해 bash 의 위 치 를 볼 수 있 습 니 다.
    3.3 bash 파일 을 실행 가능 한 파일 로 설정 하고 bash 프로그램 을 실행 합 니 다.
    $ chmod +x "         "/"   "
    #for instance
    $ chmod +x ~/Public/bash_lerning/begin00.sh
    

    그리고 명령 창 을 열 고 프로그램 을 실행 합 니 다. 다음 세 가지 방법 이 있 습 니 다.
    $ . "    "/"   "
    $ ./"    "/"   "
    $ bash /"    "/"   "
    

    예컨대
    $ . ~/Public/base_learning/begin00.sh
    >>
    Hello, world!
    

    실행 가능 한 파일 을 설정 하지 않 고 3.3 작업 을 수행 하지 않 으 면 bash 파일 을 직접 실행 하면 알림: bash: "파일": Permission denied!
    3.4 debug bash script
    bash 스 크 립 트 를 debug 하 는 5 가지 방법 이 있 습 니 다.
    $ bash -x bash-name  #   
    $ bash -xv bash-name   #   
    

    세 번 째 방식 은 bash 파일 에 설정 합 니 다.
    #! /bin/bash -x
    

    네 번 째 방식 은 bash 파일 에 설정 합 니 다.
    #! /bin/bash
    ## Turn on debug mode##
    set -x
    ...
    ...
    ...
    ##Turn off debug mode##
    set +x
    

    제 5 종
    #!/bin/bash -x
    set -n     #   bash  ,     
    set -o noexec
    

    다섯 번 째 방식 은 일반적으로 bash 파일 에 문법 오류 가 있 는 지 확인 하 는 데 사 용 됩 니 다.
    4, 셸 의 변수
    4.1 시스템 변수
    다음 세 가지 명령 을 통 해 시스템 변 수 를 볼 수 있 습 니 다.
    $ set
    $ env
    $ printenv
    

    4.2 bash 셸 의 변수
    4.2.1 bash 셸 의 변수 문법 은:
    varName = someValue 주의 등호 양쪽 에 빈 칸 을 넣 으 면 안 됩 니 다. 이것 은 python, matlab 등 언어의 문법 규칙 과 매우 다 릅 니 다. 밤 을 들 어 보 세 요.
    #! /bin/bash
    var1="hello, world"
    var2 = 123
    echo "var1= ${var1}"
    echo "var2= ${var2}"
    

    명령 행 에서 다음 작업 을 수행 합 니 다.
    chmod +x begin00.sh
    ./begin00.sh
    >>
    ./begin00.sh: line 3: var2: command not found
    var1= hello, world!
    var1= 
    

    bash 컴 파일 러 가 설명 할 때 등호 왼쪽 에 빈 칸 이 있 는 var 2 는 cmd 명령 이 라 고 생각 하기 때문에 잘못 보 고 했 지만 var 1 은 완전히 정확 하 다.이것 이 바로 bash 변수의 사용 방법 이다.
    ${varName}----  
    $varName ------   ,      。
    

    4.2.2 변수의 값 을 어떻게 표시 합 니까?
    두 가지 방법 중 하 나 는 echo 이 고 하 나 는 C + + 언어의 스타일 의 printf 입 니 다.문법
    echo "${varName}"
    print "${varName}"  #printf       C++    
    

    위의 예 설명 을 계속 하 세 요.
    #! /bin/bash
    var1="hello, world!"
    var2=123
    echo "var1= ${var1}"
    printf "var2= %d
    "
    ${var2}

    실행 프로그램:
    $ ./begin00.sh 
    >>
    var1= hello, world!
    var2= 123
    

    4.2.3 bash 셸 에서 변수의 기본 값
    문법
    echo ${varName=somevalue1 somevalue1}   # 1 
    

    혹은
    echo ${varName:=somevalue1 somevalue1}  # 2 
    

    혹은
    echo ${varName-somevalue1 somevalue1}   # 3 
    

    이 세 가 지 는 모두 기본 값 을 부여 할 수 있 지만 그 당시 1, 2 두 가 지 는 세 번 째 와 구별 되 었 고 밤 을 들 었 다.
    echo ${var3:=34 56}
    echo ${var4-23 45 78}
    echo ${var5=-23 -45}
    echo ${var3}
    echo ${var4}
    echo ${var5}
    

    실행 결 과 는 다음 과 같다.
    ./begin00.sh 
    34 56
    23 45 78
    -23 -45
    34 56
    
    -23 -45
    

    대응 코드 를 통 해 알 수 있 듯 이 세 번 째 방식 으로 변 수 를 주 는 기본 값 은 한 번 사용 한 후에 바로 방출 되 고 unset 명령 을 실행 한 것 과 같 으 며 1, 2 두 번 째 방법 은 변수 에 계속 저 장 됩 니 다.
    4.3 자체 코드 분석
    다음은 일부 코드 와 운행 결 과 를 붙 여 학습 분석 을 제공 하고 비교적 간단 한 입문 을 제공 합 니 다.
    #! /bin/bash
    
    #================================================================
    #   Copyright (C) 2018 * Ltd. All rights reserved.
    #
    #   File name   : begin01.sh
    #   Author      : simileciWH
    #   Email       : [email protected]
    #   Created date: 2018-11-14 10:44:55
    #   Description : code is far away from bugs with the god animal protecting
    #
    #================================================================
    
    echo hello world
    echo "hello world"
    echo "Current data: $(date) @ $(hostname)"
    echo "Network configuration"
    /sbin/ifconfig
    pwd
    /bin/pwd
    echo "Hello, ${LOGNAME}"
    echo "Today is $(date)"
    echo "Users currently on the machine, and their processes:"
    w		#use man w to help yourself
    

    실행 결과:
    hello world
    hello world
    Current data: 2018  11  26      11:27:52 CST @ pcMaster
    Network configuration
    enp7s0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
            ether 28:d2:44:35:bc:85  txqueuelen 1000  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
            device interrupt 19  
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 2786  bytes 424414 (424.4 KB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 2786  bytes 424414 (424.4 KB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    wlp8s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.31.129  netmask 255.255.255.0  broadcast 192.168.31.255
            inet6 fe80::c363:6e0f:c564:4f4f  prefixlen 64  scopeid 0x20<link>
            ether a4:db:30:bf:8d:c1  txqueuelen 1000  (Ethernet)
            RX packets 295059  bytes 332704942 (332.7 MB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 132331  bytes 16925943 (16.9 MB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    /home/simileciwh/Public/bash_begin
    /home/simileciwh/Public/bash_begin
    Hello, simileciwh
    Today is 2018  11  26      11:27:52 CST
    Users currently on the machine, and their processes:
     11:27:52 up  3:18,  1 user,  load average: 0.87, 0.69, 0.63
    USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
    simileci :0       :0               08:10   ?xdm?   5:11   0.00s /usr/lib/gdm3/g
    
    

    5, 인용 인용
    bash script 에는 3 개의 quote (참조) 기호 가 있 습 니 다.
    quote type
    명칭.
    속뜻
    "
    작은 따옴표
    작은 따옴표 의 모든 내용 을 보호 합 니 다.변수 와 명령 줄 은 바 꿀 수 있 습 니 다.

    작은 따옴표
    작은 따옴표 의 모든 내용 을 보호 하 며, 어떠한 교환 도 해 서 는 안 된다.
    \
    백 슬 래 쉬
    특수 문자 의 기능 이나 의 미 를 취소 합 니 다.
    밤 을 들 어 라: 시스템 변수 인 HOSTNAME 를 사용 하 라. 예 를 들 어 HOSTNAME 의 값 은 컴퓨터 의 이름 이 고 사람마다 다르다.
    #! /bin/bash
    echo "${HOSTNAME}"  #        
    echo '${HOSTNAME}'  #         
    echo "\${HOSTNAME}" #    $      !
    

    실행 결과:
    pcMaster
    ${HOSTNAME}
    ${HOSTNAME}
    

    6, 키보드 에서 사용자 의 입력 획득
    6.1 read -p
    read 명령: "문법":
    read -p "prompt" variable1 variable2 variableN
    

    매개 변수 "- p" 는 사용자 에 게 알림 정 보 를 표시 합 니 다. 변수 variable 1, variable 2,..................................................................밤 을 들다
    #! /bin/bash
    read -p "       :" name
    echo "Hi, ${name}. I have remember you!"
    

    실행 가능 한 파일 로 파일 을 설정 하 는 것 을 잊 지 마 세 요!실행 결과:
           :simileciwh
    Hi, simileciwh. I have remember you!
    

    6.2 read -t
    때때로 사용자 와 입력 하 는 시간 을 제한 하거나 사용자 의 입력 을 기다 리 는 상태 가 아니 므 로 timeout input 체 제 를 설정 하여 입력 을 기다 리 는 창 이 일정 시간 후에 자동 으로 닫 히 도록 해 야 합 니 다."문법":
    read -t Num -p "prompt" var1 var2 varN
    

    인자 - t 는 timeout 이라는 뜻 으로 Num 시간 단 위 는 초 (s) 입 니 다. 즉, Num 초 후에 자동 으로 끝나 사용자 의 입력 을 기다 리 지 않 습 니 다.
    6.3 read -s
    사용자 암 호 를 가 져 올 때 사용자 가 입력 한 암 호 를 표시 하지 않 기 를 원 하지 않 기 때문에 인자 - s 를 사용 하여 사용자 의 입력 을 숨 기 고 표시 하지 않 을 수 있 습 니 다."문법":
    read -s -p "prompt" variable
    

    6.4 read - r 일괄 처리 여러 변수의 할당
    밤 을 들다
    nameservers="12 23 546"
    echo "$nameservers"
    read -r v1 v2 v3 <<< "$nameservers"
    echo "v1=$v1, v2=$v2, v3=$v3"
    

    실행 결과:
    12 23 546
    v1=12, v2=23, v3=546
    

    7, 산수 연산
    연산 자
    묘사 하 다.
    예시
    +
    덧셈
    echo $((2+3))
    -
    감법
    echo $((5-2))
    *
    곱셈
    echo $((2*3))
    /
    나눗셈
    echo $((4/2))
    %
    나머지 를 취하 다
    echo $((5%2))
    ++
    더 하 다
    x=2; echo $((x++)),x=2; echo $((++x))
    --
    자감 하 다
    x=3; echo $((x–)),x=3; echo $((–x))
    **
    제곱
    echo $((10**2))
    이것들 은 C 언어의 규칙 과 충돌 하지 않 는 다.
    8,declare
    declear 명령 을 사용 하여 변수의 값 과 속성 을 설정 합 니 다."문법":
    declare [  ] variable
    

    매개 변 수 는 다음 과 같이 선택 할 수 있 습 니 다.
    매개 변수
    속뜻
    -i
    변수 유형
    -r
    변수 형식 - readonly - 읽 기 전용
    -x
    export 형식 설정
    -g
    함수 에 사용 할 전역 변 수 를 만 듭 니 다.그렇지 않 으 면 무시 합 니 다.
    -p
    변수의 속성 과 값 보이 기
    다른 속성 도 있 습 니 다. help 명령 을 통 해 볼 수 있 습 니 다.
    9, 상수 변수 만 들 기
    두 가지 방법 이 있 습 니 다. 하 나 는 readonly 명령 을 사용 하 는 것 이 고, 다른 하 나 는 declare - r 명령 을 사용 하 는 것 입 니 다.상수 변수의 값 이 초기 화 되 었 을 때 unset 를 사용 하 더 라 도 수정 할 수 없습니다.밤 을 들다
    readonly var1=23
    declare -r var2=32
    var1=34
    var2=45
    echo "var1= ${var1}"
    echo "var2= ${var2}"
    unset var1
    var1=34
    echo "var1= ${var1}"
    

    실행 결과:
    ./123.sh: line 3: var1: readonly variable
    ./123.sh: line 4: var2: readonly variable
    var1= 23
    var2= 32
    ./123.sh: line 7: unset: var1: cannot unset: readonly variable
    ./123.sh: line 8: var1: readonly variable
    var1= 23
    

    좋은 웹페이지 즐겨찾기