셸 스 크 립 트 프로 그래 밍 (기본 편)

12689 단어
기초 편
출력 정보
대부분의 Shell 명령 은 스 크 립 트 가 실 행 될 때 터미널 화면 에 출력 정 보 를 생 성 합 니 다.그러나 출력 된 정보 에 자신의 내용 을 추가 하여 사용자 스 크 립 트 가 실 행 될 때 무슨 일이 발생 하 는 지 알려 주 고 더 좋 은 상호작용 효 과 를 얻 을 때 가 많 습 니 다.echo 명령 은 문자열 내용 을 인쇄 할 수 있 습 니 다.
$  echo This is a test
This is a test
$

PS: 기본적으로 echo 명령 뒤의 문자열 을 따옴표 에 포함 시 킬 필요 가 없습니다.echo 텍스트 문자열 의 구분자 로 따옴표 를 사용 할 수 있 습 니 다.예:
$ echo 'Hello
> World'
Hello
World

출력 된 텍스트 내용 에 따옴표 가 있 을 때 Let's see if this'll work 와 같이 단일 따옴표 와 결합 하여 사용 하거나 전의 자 \ 접 두 사 를 사용 할 수 있 습 니 다.
# 引号作为字符串分隔符而不是文本内容
$ echo Let's see if this'll work
Lets see if thisll work
# 使用 \ 前缀进行转义
$ echo Let\'s see if this\'ll work
Let's see if this'll work
# 使用双引号作为分隔符,单引号作为中间的文本正常输出
$ echo "Let's see if this'll work"
Let's see if this'll work

스 크 립 트 실행 권한
기본 으로 만 든 스 크 립 트 파일 은 실행 권한 이 없 으 며 명령 행 에서 직접 실행 할 수 없습니다.다음 내용 을 포함 하 는 스 크 립 트 파일 을 만 드 는 경우 info.sh:
#!/bin/bash

echo The time and date are:
date
echo "Let's see who's logged into the system:"
who

위 스 크 립 트 를 직접 실행 할 때 알림 permission denied 오류:
$  ./info.sh
zsh: permission denied: ./info.sh
chomd +x filename 명령 을 사용 하여 이 스 크 립 트 파일 에 실행 권한 을 추가 한 후 실행 해 야 합 니 다. 효 과 는 다음 과 같 습 니 다.
$ chmod +x info.sh
$ ./info.sh
The time and date are:
Wed Oct 31 11:48:07 CST 2018
Let's see who's logged into the system:
starky   console  Oct 28 12:42
starky   ttys000  Oct 29 16:52
starky   ttys001  Oct 31 11:23

변수
1. 시스템 환경 변수
셸 스 크 립 트 에서 시스템 의 환경 변 수 를 직접 방문 하여 시스템 정보 (예 를 들 어 컴퓨터 이름, 현재 로그 인 한 사용자 의 계 정 이름, UID 와 홈 디 렉 터 리 등) 를 얻 을 수 있 습 니 다.현재 정 의 된 모든 환경 변 수 는 set 명령 을 통 해 가 져 올 수 있 습 니 다.
$ set
...
HISTCMD=2217
HISTFILE=/Users/starky/.zsh_history
HISTSIZE=50000
HOME=/Users/starky
HOST=skitars-MacBook-Pro.local
IFS=$' \t
\C-@' ITERM_PROFILE=starky ...

셸 스 크 립 트 에서 구체 적 인 환경 변수의 값 을 사용 해 야 할 때 환경 변수 이름 에 $ 접 두 사 를 붙 여 표시 할 수 있 습 니 다 (예 를 들 어 $HOST.다음 파일 편집 sys_info.sh:
#!/bin/bash

echo User info for userid: $USER
echo UID: $UID
echo HOME: $HOME

실행 효 과 는 다음 과 같 습 니 다:
$ chmod +x sys_info.sh
$ ./sys_info.sh
User info for userid: starky
UID: 501
HOME: /Users/starky

PS: Shell 스 크 립 트 에서 $ 변수의 접두사 로 사용 되 기 때문에 텍스트 출력 에 표시 $ 해 야 할 때 전 의 를 사용 해 야 합 니 다.
# $15 被当成了代入到字符串中的“变量”
$ echo "The cost of the item is $15"
The cost of the item is
# 使用 \ 转义后正常打印 $ 字符
$ echo "The cost of the item is \$15"
The cost of the item is $15

2. 사용자 정의 변수
Shell 스 크 립 트 는 사용자 가 변 수 를 스스로 정의 하고 사용 할 수 있 도록 합 니 다. 그러면 스 크 립 트 에 사 용 된 데 이 터 를 지정 한 변수 에 임시로 저장 하고 사용 할 때 $变量名 형식 으로 가 져 올 수 있 습 니 다.
  • 변수 할당: var=value (주의 = 번호 양쪽 에 빈 칸 이 있 으 면 안 됩 니 다. 즉, var = value 잘못된 것 입 니 다.
  • 변수 사용: $var
  • PS: Shell 스 크 립 트 의 변수 이름 구분 대소 문자 Shell 스 크 립 트 는 변수 값 의 데이터 형식 변 수 를 자동 으로 판단 하여 스 크 립 트 의 전체 수명 주 기 를 관통 합 니 다. 즉, 스 크 립 트 가 실 행 된 후 변 수 는 자동 으로 삭 제 됩 니 다.
    다음 파일 편집 variables.sh:
    #!/bin/bash
    
    days=10
    guest="Katie"
    echo "$guest checked in $days days ago"
    
    days=5
    guest="Jessica"
    echo "$guest checked in $days days ago"
    

    실행 효 과 는 다음 과 같 습 니 다:
    $ chmod +x variables.sh
    $ ./variables.sh
    Katie checked in 10 days ago
    Jessica checked in 5 days ago
    $ echo $days
    
    

    스 크 립 트 가 종료 되면 스 크 립 트 에서 정의 한 $days 변 수 는 정의 되 지 않 은 상태 로 복 원 됩 니 다.
    3. 명령 교체
    셸 스 크 립 트 의 가장 유용 한 특성 중 하 나 는 명령 의 출력 정 보 를 추출 하고 변 수 를 할당 하 는 것 입 니 다.다음 두 가지 방식 으로 명령 출력 을 변수 에 할당 할 수 있 습 니 다.
  • 작은 따옴표 (`)
  • $() 형식
  • 예:
    # 使用 date 命令获取当前的日期和时间
    $ date
    Thu Nov  1 01:03:02 CST 2018
    # 将 date 命令的输出(即当前日期和时间)赋值给 var1 变量
    $ var1=`date`
    $ echo Today is: $var1
    Today is: Thu Nov  1 01:03:15 CST 2018
    # 将 date 命令的输出赋值给 var2 变量(使用 $() 格式)
    $ var2=$(date)
    $ echo Today is: $var2
    Today is: Thu Nov  1 01:03:36 CST 2018
    

    예제 프로그램: 명령 으로 스 크 립 트 log.sh 를 교체 합 니 다. 이 스 크 립 트 는 현재 시간 워 터 마크 를 접미사 로 하 는 텍스트 파일 을 만 들 수 있 습 니 다. 내용 은 /usr/bin 디 렉 터 리 에 있 는 모든 파일 목록 입 니 다.
    #!/bin/bash
    
    today=$(date +%y%m%d%H%M%S)
    ls -al /usr/bin > log.$today
    echo The file log.$today has been created, you can check it later.
    

    그 중에서 date +%y%m%d%H%M%S 명령 은 순수 디지털 형식의 날짜 와 시간 운행 효 과 를 다음 과 같이 출력 할 수 있 습 니 다.
    $ chmod +x log.sh
    $ ./log.sh
    The file log.181101012159 has been created, you can check it later.
    $ ls log*
    log.181101012159 log.sh
    $ head log.181101012159
    total 103992
    drwxr-xr-x  971 root   wheel     31072 Oct 13 17:44 .
    drwxr-xr-x@   9 root   wheel       288 Sep 21 12:01 ..
    -rwxr-xr-x    4 root   wheel       925 Aug 18 08:45 2to3-
    lrwxr-xr-x    1 root   wheel        74 Oct 13 17:44 2to3-2.7 -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/2to3-2.7
    -rwxr-xr-x    1 root   wheel     55072 Sep 21 12:16 AssetCacheLocatorUtil
    -rwxr-xr-x    1 root   wheel     53472 Sep 21 12:16 AssetCacheManagerUtil
    -rwxr-xr-x    1 root   wheel     48256 Sep 21 12:17 AssetCacheTetheratorUtil
    -rwxr-xr-x    1 root   wheel     18320 Sep 21 12:17 BuildStrings
    -rwxr-xr-x    1 root   wheel     18288 Sep 21 12:17 CpMac
    

    4. 입력 과 출력 을 재 설정 합 니 다.
    1. 출력 방향 변경
    가장 기본 적 인 방향 을 바 꾸 는 것 은 번호 (>) 보다 큰 명령 의 출력 내용 을 파일 에 저장 하 는 것 입 니 다.
    형식: command > outputfile
    $ date > current_date.txt
    $ ls -l current_date.txt
    -rw-r--r--  1 starky  staff  29 Nov  1 01:29 current_date.txt
    $ cat current_date.txt
    Thu Nov  1 01:29:45 CST 2018
    

    PS: 방향 을 바 꿀 때 지정 한 파일 이 존재 하면 이 파일 의 원본 내용 은 새 내용 으로 덮어 씁 니 다.파일 끝 에 내용 만 추가 하려 면 번호 (>) 이상 을 사용 할 수 있 습 니 다.
    $ date >> current_date.txt
    $ cat current_date.txt
    Thu Nov  1 01:29:45 CST 2018
    Thu Nov  1 01:34:03 CST 2018
    

    2. 재 설정 입력
    입력 재 설정 과 출력 재 설정 이 반대 입 니 다.파일 에서 내용 을 읽 고 명령 에 전달 하 는 것 이다.
    형식: command < inputfile
    $ ls -l /Users/starky
    total 49864
    drwx------@  3 starky  staff        96 Oct 13 18:00 Applications
    drwx------+ 23 starky  staff       736 Oct 31 19:14 Desktop
    drwx------+ 21 starky  staff       672 Oct 31 19:15 Documents
    drwx------+ 37 starky  staff      1184 Oct 30 20:18 Downloads
    drwx------+ 72 starky  staff      2304 Oct 27 01:38 Library
    drwx------+  6 starky  staff       192 Oct 29 10:34 Movies
    drwx------+  3 starky  staff        96 Sep 27 13:13 Music
    ...
    $ cat directory.txt
    /Users/starky
    $ ls -l < directory.txt
    total 49864
    drwx------@  3 starky  staff        96 Oct 13 18:00 Applications
    drwx------+ 23 starky  staff       736 Oct 31 19:14 Desktop
    drwx------+ 21 starky  staff       672 Oct 31 19:15 Documents
    drwx------+ 37 starky  staff      1184 Oct 30 20:18 Downloads
    drwx------+ 72 starky  staff      2304 Oct 27 01:38 Library
    drwx------+  6 starky  staff       192 Oct 29 10:34 Movies
    drwx------+  3 starky  staff        96 Sep 27 13:13 Music
    ...
    

    3. 파이프
    어떤 때 는 어떤 명령 의 출력 내용 을 다른 명령 의 입력 으로 해 야 한다.예:
    $ ls -al > tmp_file
    $ grep vim < tmp_file
    drwxr-xr-x    3 starky  staff        96 Oct 20 15:45 .vim
    -rw-------    1 starky  staff     23799 Nov  1 01:40 .viminfo
    -rw-r--r--    1 starky  staff      3935 Oct 21 01:31 .vimrc
    -rw-r--r--    1 starky  staff  24849808 Oct 25 21:02 vim.tar.gz
    

    위의 명령 은 현재 디 렉 터 리 에 있 는 파일 목록 ls -altmp_file 에 저장 한 다음 grep 명령 으로 tmp 읽 기file 의 내용, 파일 이름 에 vim 이 포 함 된 파일 을 선별 합 니 다.
    사실 파이프 | 를 통 해 앞의 명령 의 출력 을 뒤의 명령 으로 입력 할 수 있 습 니 다.
    형식: command1 | command2
    ls -al | grep vim
    drwxr-xr-x    3 starky  staff        96 Oct 20 15:45 .vim
    -rw-------    1 starky  staff     23799 Nov  1 01:40 .viminfo
    -rw-r--r--    1 starky  staff      3935 Oct 21 01:31 .vimrc
    -rw-r--r--    1 starky  staff  24849808 Oct 25 21:02 vim.tar.gz
    

    수학 연산
    수학 연산 을 조작 하 는 것 은 모든 프로 그래 밍 언어 에 있어 서 매우 중요 한 특성 이다.그러나 Shell 스 크 립 트 는 산술 연산 을 직접 완성 할 수 없고 다음 과 같은 두 가지 방식 으로 만 이 루어 질 수 있 습 니 다.
    1. expr 명령
    Shell 은 수학 산식 을 처리 하 는 특수 한 명령 expr 을 제공 합 니 다. 예 를 들 어:
    $ expr 1 + 2
    3
    

    PS: 산식 + 호 양쪽 의 빈 칸 expr 명령 이 지원 하 는 산술 연산 자 는 다음 과 같 습 니 다.
    조작 부호
    속뜻
    ARG1 || ARG2
    두 매개 변수 값 이 모두 null 또는 0 이 아니라면 ARG 1 을 되 돌려 줍 니 다. 그렇지 않 으 면 ARG 2 를 되 돌려 줍 니 다.
    ARG1 && ARG2
    두 매개 변수 값 이 모두 null 또는 0 이 아니라면 ARG 1 을 되 돌려 줍 니 다. 그렇지 않 으 면 0 을 되 돌려 줍 니 다.
    ARG1 < ARG2
    ARG 1 이 ARG 2 보다 작 으 면 1 로 돌아 갑 니 다. 그렇지 않 으 면 0 으로 돌아 갑 니 다.
    ARG1 > ARG2
    ARG 1 이 ARG 2 보다 크 면 1 로 돌아 가 고 그렇지 않 으 면 0 으로 돌아 갑 니 다.
    ARG1 = ARG2
    ARG 1 이 ARG 2 와 같 으 면 1 로 돌아 가 고 그렇지 않 으 면 0 으로 돌아 갑 니 다.
    ARG1 >= ARG2
    ARG 1 이 ARG 2 보다 크 거나 같 으 면 1 로 돌아 가 고 그렇지 않 으 면 0 으로 돌아 갑 니 다.
    ARG1 <= ARG2
    ARG 1 이 ARG 2 보다 작 거나 같 으 면 1 로 돌아 가 고 그렇지 않 으 면 0 으로 돌아 갑 니 다.
    ARG1 != ARG2
    ARG 1 이 ARG 2 와 같 지 않 으 면 1 로 돌아 가 고 그렇지 않 으 면 0 으로 돌아 갑 니 다.
    ARG1 + ARG2
    ARG 1 과 ARG 2 의 숫자 더하기 되 돌리 기
    ARG1 - ARG2
    ARG 1 에서 ARG 2 의 숫자 차 를 빼 주세요.
    ARG1 * ARG2
    ARG 1 과 ARG 2 의 숫자 곱 하기 되 돌리 기
    ARG1/ARG2
    ARG 1 을 ARG 2 로 나 눈 숫자 상 (결 과 는 정수) 을 구하 십시오.
    ARG1 % ARG2
    ARG 1 과 ARG 2 에 대한 잉여 조작
    수학 연산 예시 divide.sh:
    #!/bin/bash
    
    var1=10
    var2=20
    var3=`expr $var2 / $var1`
    
    echo $var2 divided by $var1 equals $var3
    

    실행 효과:
    $ chmod +x divide.sh
    $ ./divide.sh
    20 divided by 10 equals 2
    

    2. 괄호 사용
    Bash Shell 의 expr 명령 은 주로 Bourne Shell 과 의 호환성 을 유지 하기 위해 서 이 며, 사실은 수학 연산 을 처리 하 는 더욱 간단 한 방식 도 제공 했다.즉, 이러한 형식 을 사용한다. $[ operation ]아래 스 크 립 트 와 같이 compute.sh
    #!/bin/bash
    
    var1=100
    var2=50
    var3=45
    
    result=$[$var1 * ($var2 - $var3)]
    echo The final result is $result
    

    실행 효과:
    $ chmod +x compute.sh
    $ ./compute.sh
    The final result is 500
    

    그러나 나눗셈 연산 을 할 때 위의 방식 은 정수 만 지원 한다.만약 두 개의 수 를 나 눈 결과 가 소수 라면, 이 결 과 는 소수 부분 을 버 리 고 정수 만 보존 할 것 이다.
    $ var1=10
    $ var2=3
    $ result=$[$var1 / $var2]
    $ echo The result is $result
    The result is 3
    

    3. 부동 소수점 연산
    bash 의 정수 제한 을 극복 할 수 있 는 여러 가지 방안 이 있 는데 가장 많이 사용 되 는 것 은 시스템 에 내 장 된 bash calculator, 즉 bc 프로그램 을 사용 하 는 것 이다.bash calculator 는 부동 소수점 연산 을 지원 하 는 프로 그래 밍 언어 로 다음 과 같은 몇 가지 유형의 데 이 터 를 식별 할 수 있 습 니 다.
  • 숫자 (정수 와 부동 소수점)
  • 변수 (단순 변수 와 배열)
  • 주석 (한 줄 주석 # 과 여러 줄 주석 /* */
  • 표현 식
  • 프로 그래 밍 문 (예 를 들 어 if-then
  • 함수
  • $ bc
    bc 1.06
    Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
    This is free software with ABSOLUTELY NO WARRANTY.
    For details type `warranty'.
    12 * 5.4
    64.8
    3.156 * (3 + 5)
    25.248
    quit
    

    계산 결과 가 정확 한 소수 자릿수 는 내 장 된 scale 변 수 를 통 해 정 의 됩 니 다. 기본 scale 수 치 는 0 (즉, 기본 반올림 업 체 의 소수 자릿수) 입 니 다.
    $ bc -q
    3.44 / 5
    0
    scale=4
    3.44 / 5
    .6880
    quit
    
    bc 프로그램 도 사용자 정의 변 수 를 지원 합 니 다.
    $ bc -q
    var1=10
    var1 * 4
    40
    var2=var1 / 5
    print var2
    2
    quit
    

    4. 스 크 립 트 에서 bc 사용
    파 이 프 를 통 해 수학 표현 식 을 bc 프로그램 에 전달 한 다음 에 계 산 된 결 과 를 할당 문 구 를 통 해 특정한 변수 에 할당 할 수 있 습 니 다. variable=$(echo "options; expression" | bc)그 중에서 variable=$(...) 명령 의 출력 을 추출 하고 변 수 를 할당 하 는 데 사 용 됩 니 다 (제3 장 명령 교체 참조)
    다음 스 크 립 트 와 같이 bc1.sh:
    #!/bin/bash
    
    var1=100
    var2=45
    var3=$(echo "scale=4; $var1 / $var2" | bc)
    
    echo The answer for this is $var3
    

    실행 효과:
    $ chmod +x bc1.sh
    $ ./bc1.sh
    The answer for this is 2.2222
    

    더 복잡 한 형식.
    스 크 립 트 에서 사용 bc 은 다음 과 같은 형식 으로 사용 할 수 있 습 니 다.
    variable=$(bc << EOF
    options
    statements
    expressions
    EOF
    )
    

    예제 프로그램 은 다음 과 같다 bc2.sh.
    #!/bin/bash
    
    var1=10.46
    var2=43.67
    var3=33.2
    var4=71
    
    var5=$(bc << EOF
    scale = 4
    a1=$var1 * $var2
    b1=$var3 * $var4
    a1 + b1
    EOF
    )
    
    echo The final answer for this mess is $var5
    

    실행 결과:
    $ chmod +x bc2.sh
    $ ./bc2.sh
    The final answer for this mess is 2813.9882
    

    참고 자료
    Linux Command Line and Shell Scripting Bible 3rd Edition

    좋은 웹페이지 즐겨찾기