셸 스 크 립 트 프로 그래 밍 (기본 편)
출력 정보
대부분의 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
다음 파일 편집
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 -al
을 tmp_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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.