산 선 에 게 셸 프로 그래 밍 배우 기 (1)

더 읽 기
앞에서 산 선 은 리 눅 스 기반 셸 명령 시리즈 의 블 로 그 를 완 공 했 습 니 다. 만약 에 Liux 기반 의 친구 가 없다 면 셸 명령 부터 공부 하 는 것 을 권장 합 니 다. 일정한 기초 가 있 으 면 바로 뛰 어 넘 을 수 있 습 니 다.이 편 에서 산선 이 써 야 할 것 은 셸 프로 그래 밍 시리즈 에 관 한 지식 이다.
앞에서 우리 의 예 에서 명령 은 대체적으로 하나의 명령 으로 실 행 된 것 이다. 그러나 Liux 에서 명령 을 하나의 스 크 립 트 로 조합 하여 발휘 하 는 역할 만 이 큰 것 이다. 이것 은 벽돌 과 비슷 해서 쓸모 가 없 지만 벽돌 을 많이 사용 하면 우 리 는 큰 빌딩 을 지 을 수 있다. 그러면 그들의 가 치 를 나 타 낼 수 있다.
Liux 에서 우 리 는 분점 을 사용 하여 두 개의 명령 을 나 눌 수 있 습 니 다.
[root@h1 ~]# who ;date
root     pts/0        2014-08-08 02:55 (192.168.46.22)
2014  08  08      03:39:43 CST
[root@h1 ~]# 

스 크 립 트 에서 도 실행 할 수 있 습 니 다. 셸 스 크 립 트 를 만 드 는 머리 생명 은 보통\#!/bin/bash 시작, 이 시작 을 제외 한 다른\# 시작 은 모두 주석 내용 입 니 다:
vi test. sh 스 크 립 트 편집
#!/bin/bash

#       
date
who
[root@h1 ~]# sh test.sh 
2014  08  08      03:46:15 CST
root     pts/0        2014-08-08 02:55 (192.168.46.22)
[root@h1 ~]# 

두 가지 호출 방법 은 권한 이 없습니다. 권한 을 부여 할 수 있 습 니 다.
[root@h1 ~]# sh test.sh 
2014  08  08      03:46:15 CST
root     pts/0        2014-08-08 02:55 (192.168.46.22)
[root@h1 ~]# ./test.s
-bash: ./test.s:          
[root@h1 ~]# ./test.sh
-bash: ./test.sh:     
[root@h1 ~]# chmod u+x test.sh 
[root@h1 ~]# ll
    328476
-rw-r--r--  1 root   root 143775368 7   28 19:30 abc1.txt
-rw-------. 1 root   root      1087 6   13 19:06 anaconda-ks.cfg
-rw-r--r--  1 root   root        52 7   31 21:29 count2.txt
-rw-r--r--  1 root   root        52 7   31 19:46 count.txt
-rw-r--r--. 1 root   root  96183833 6    9 17:27 hadoop-2.2.0.tar.gz
-rw-r--r--  1 root   root         1 7   31 21:25 hh.txt
drwxr-xr-x  3 root   root      4096 7   29 04:47 hivesrc
-rw-r--r--. 1 root   root      2111 6   16 13:10 initserver.sh
-rw-r--r--. 1 root   root      7995 6   13 19:06 install.log
-rw-r--r--. 1 root   root      3384 6   13 19:06 install.log.syslog
drwxr-xr-x  2 root   root      4096 7   31 21:19 intest
lrwxrwxrwx  1 root   root        12 7   31 21:45 jdk -> jdk1.7.0_25/
drwxr-xr-x. 8 search  143      4096 6    6 2013 jdk1.7.0_25
-rwx------. 1 root   root  96316511 11  20 2013 jdk-7u25-linux-x64.gz
drwxr-xr-x  3 root   root      4096 7   31 21:33 li
drwxr-xr-x  3 root   root      4096 7    9 04:08 lo
drwxr-xr-x  3 root   root      4096 7    9 04:08 login
-rw-r--r--  1 root   root      1048 6   19 03:31 setlimit.sh
drwxr-xr-x  2 root   root      4096 8    5 01:44 test
drwxr-sr-x  2 root   abc       4096 8    6 01:53 testidr
-rwxr--r--  1 root   root        46 8    8 03:43 test.sh
drwxr-xr-x  3 root   root      4096 6   20 02:51 tsethadoop
[root@h1 ~]# ./test.sh 
2014  08  08      03:47:10 CST
root     pts/0  

JAVA 의 System. out. println () 기능 과 같은 텍스트 를 어떻게 출력 하 는 지, Liux 의 echo 가 이 기능 을 제공 합 니 다.
문자열 에 작은 따옴표 가 나타 나 면 작은 따옴표 로 묶 고, 작은 따옴표 가 나타 나 면 작은 따옴표 로 묶 고, 작은 따옴표 가 나타 나 도 작은 따옴표 가 나타 나 면\\전의:
[root@h1 ~]# echo "a's dog"
a's dog
[root@h1 ~]# echo "a's"" dog"
a's dog
[root@h1 ~]# echo "a's"abc" dog"
a'sabc dog
[root@h1 ~]# echo "a's\"abc\" dog"
a's"abc" dog
[root@h1 ~]# echo 'a 'dog' "abc"'
a dog "abc"

echo - n 인 자 는 마지막 줄 바 꾸 기 를 피 할 수 있 습 니 다. System. out. print () 와 유사 합 니 다.
echo -n  "conent:"
date
[root@h1 ~]# sh a.sh 
conent:2014  08  08      04:00:14 CST

echo 는 문자열 에서 Liux 환경 변 수 를 사용 하여 정확하게 출력 할 수 있 습 니 다.
[root@h1 ~]# echo "my home is $HOME"
my home is /root
[root@h1 ~]# 

사용자 변 수 는 등호 대 가 를 통 해 정 의 됩 니 다. 등호 좌우 에 빈 칸 이 있 으 면 안 됩 니 다. 변수 이름 은 대소 문 자 를 구분 합 니 다.
[root@h1 ~]# more a.sh 

name="      "

echo "info: $name"

[root@h1 ~]# sh a.sh 
info:       
[root@h1 ~]# 

변수 간 할당:
[root@h1 ~]# more a.sh 

name="      "

name2=$name


echo "info: $name2"

[root@h1 ~]# sh a.sh 
info:       
[root@h1 ~]# 

셸 명령 을 변수 에 할당 하고, 인덱스 를 사용 합 니 다:
[root@h1 ~]# more b.sh 


test=`date;who`

echo -n "         ,     :"

echo $test
[root@h1 ~]# sh b.sh 
         ,     :2014  08  08      04:14:37 CST root pts/0 2014-08-08 02:55 (192.168.46.22)
[root@h1 ~]# 

자바 스 크 립 트 의 eval 키워드 와 같은 반 따옴표 기능 으로 문자열 명령 을 해석 할 수 있 습 니 다.
이 를 통 해 우 리 는 파일 을 만 들 때 시간 이름 을 붙 일 수 있 습 니 다.
[root@h1 ~]# more c.sh 


#  date       ,     

filename=`date +%y%m%d`

echo "        " > log.$filename
[root@h1 ~]# more log.140808 
        
[root@h1 ~]# 

출력 리 셋 명령:
> 덮어 쓰기 모드 재 설정
>> 추가 모드 재 설정
리 셋 명령 입력
<
내 연 입력 재 설정
<<
출력 재 설정 은 여러분 이 많이 사용 할 것 이 라 고 믿 습 니 다. 입력 한 재 설정 은 많이 사용 되 지 않 을 수 있 습 니 다. 다음 산 선 은 몇 가지 예 를 들 어 보 겠 습 니 다.
[root@h1 ~]# wc < a.sh 
 8  5 65
[root@h1 ~]# 

출력 방향 을 바 꾸 면 파일 의 내용 을 명령 에 보 내 통계 할 수 있 습 니 다.
이 세 가지 숫자의 의 미 는 텍스트 의 줄 수, 단어 수, 바이트 크기 를 나타 낸다. 설명 은 8 줄, 5 단어, 65 바이트 가 있다.
내 연 재 는 방향 을 바 꾸 고 상호작용 적 인 읽 기 를 허용 합 니 다. 정 의 된 시작 부분 과 끝 문자 사이 에 통 계 를 추가 하여 통 계 를 합 니 다.
[root@h1 ~]# wc << B
> a b 1
> d c 2
> B
 2  6 12
[root@h1 ~]# 

끝 부 호 는 마음대로 정의 할 수 있 습 니 다. 산 선 은 여기 서 B 입 니 다.
다음은 파이프 명령: |
[root@h1 ~]# rpm -qa | sort
acl-2.2.49-6.el6.x86_64
attr-2.4.44-7.el6.x86_64
audit-2.2-2.el6.x86_64
audit-libs-2.2-2.el6.x86_64
authconfig-6.1.12-13.el6.x86_64
b43-openfwwf-5.2-4.el6.noarch
basesystem-10.0-4.el6.noarch
bash-4.1.2-15.el6_4.x86_64
binutils-2.20.51.0.2-5.36.el6.x86_64
bridge-utils-1.2-10.el6.x86_64
bzip2-1.0.5-7.el6_0.x86_64
bzip2-libs-1.0.5-7.el6_0.x86_64
ca-certificates-2013.1.94-65.0.el6.noarch
centos-release-6-5.el6.centos.11.1.x86_64
checkpolicy-2.0.22-1.el6.x86_64
chkconfig-1.3.49.3-2.el6_4.1.x86_64
coreutils-8.4-31.el6.x86_64
coreutils-libs-8.4-31.el6.x86_64
cpio-2.10-11.el6_3.x86_64
 

rpm - qa 는 설 치 된 패 키 지 를 조회 한 다음 sort 명령 으로 정렬 할 수 있 습 니 다.
리 셋 명령 은 여러 개 를 사용 할 수 있 습 니 다:
[root@h1 ~]# ll | more | sort
drwxr-sr-x  2 root   abc       4096 8    6 01:53 testidr
drwxr-xr-x  2 root   root      4096 7   31 21:19 intest
drwxr-xr-x  2 root   root      4096 8    5 01:44 test
drwxr-xr-x  3 root   root      4096 6   20 02:51 tsethadoop
drwxr-xr-x  3 root   root      4096 7   29 04:47 hivesrc
drwxr-xr-x  3 root   root      4096 7   31 21:33 li
drwxr-xr-x  3 root   root      4096 7    9 04:08 lo
drwxr-xr-x  3 root   root      4096 7    9 04:08 login
drwxr-xr-x. 8 search  143      4096 6    6 2013 jdk1.7.0_25
lrwxrwxrwx  1 root   root        12 7   31 21:45 jdk -> jdk1.7.0_25/
-rw-------. 1 root   root      1087 6   13 19:06 anaconda-ks.cfg
-rw-r--r--  1 root   root      1048 6   19 03:31 setlimit.sh
-rw-r--r--  1 root   root       127 8    8 04:20 c.sh
-rw-r--r--  1 root   root 143775368 7   28 19:30 abc1.txt
-rw-r--r--  1 root   root         1 7   31 21:25 hh.txt
-rw-r--r--. 1 root   root      2111 6   16 13:10 initserver.sh
-rw-r--r--  1 root   root        25 8    8 04:20 log.140808
-rw-r--r--. 1 root   root      3384 6   13 19:06 install.log.syslog
-rw-r--r--  1 root   root        52 7   31 19:46 count.txt
-rw-r--r--  1 root   root        52 7   31 21:29 count2.txt
-rw-r--r--  1 root   root        65 8    8 04:11 a.sh
-rw-r--r--. 1 root   root      7995 6   13 19:06 install.log
-rw-r--r--  1 root   root        90 8    8 04:14 b.sh
-rw-r--r--. 1 root   root  96183833 6    9 17:27 hadoop-2.2.0.tar.gz
-rwx------. 1 root   root  96316511 11  20 2013 jdk-7u25-linux-x64.gz
-rwxr--r--  1 root   root        46 8    8 03:43 test.sh
    328492
[root@h1 ~]# 

다음은 셸 에서 수학 연산 을 수행 하 는 방법 을 살 펴 보 자.
[root@h1 ~]# expr 1+5
1+5
[root@h1 ~]# expr 1 + 5
6
[root@h1 ~]# expr 1 * 8
expr:     
[root@h1 ~]# expr 1 \* 8
8
[root@h1 ~]# expr 9 / 3
3
[root@h1 ~]# expr 9 / 5
1
[root@h1 ~]# 

expr 뒤에 표현 식 이 있 습 니 다. 연산 식 좌우 에 빈 칸 이 있어 야 합 니 다.
이것 은 비교적 전통 적 인 용법 입 니 다. Liux 에는 계산기 bc 모듈 이 있 을 수 있 습 니 다. Liux 시스템 에 없 으 면 yum install bc 명령 으로 설치 하 십시오.
[root@h1 ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
12 * 5.8
69.6
8 * 4 / 2
16
5 / 3
1
5 / 3.0
1
4.44 / 2
2
scale=4
3 / 8
.3750
10 / 11
.9090
scale=2
5 / 2
2.50
10 / 3
3.33

기본적으로 소 수 를 보류 하지 않 습 니 다. scale 을 통 해 소수점 위 치 를 설정 할 수 있 습 니 다.
마지막 으로 quit 명령 을 사용 하여 프로그램 을 종료 합 니 다.
스 크 립 트 에서 bc 명령 을 사용 하 는 방법 을 살 펴 보 겠 습 니 다.
[root@h1 ~]# more bc.sh 



out=`echo "scale=4;  10 / 3" | bc`

echo "       :$out"
[root@h1 ~]# sh bc.sh 
       :3.3333
[root@h1 ~]# 

우 리 는 또한 결합 할 수 있 습 니 다. 내 연 재 는 bc 계산 기 를 사용 하여 스 크 립 트 에 있 습 니 다.
[root@h1 ~]# more cc.sh 



var1=10.23
var2=9
var3=1

var4=`bc << EOF
scale=4
a1 = ($var1+$var2)
b1 = ($var2+$var3)
a1 + b1
EOF
`

echo "      : $var4"
[root@h1 ~]# sh cc.sh 
      : 29.23
[root@h1 ~]# 

스 크 립 트 종료 상태 코드 를 살 펴 보 겠 습 니 다.
변수 $를 사용 하 시 겠 습 니까?
[root@h1 ~]# date
2014  08  08      05:16:38 CST
[root@h1 ~]# echo $?
0
[root@h1 ~]# dates
-bash: dates: command not found
[root@h1 ~]# echo $?
127
[root@h1 ~]# 

1, 0 은 성공 입 니 다.
2, 1 통용 되 는 알 수 없 는 오류
3, 126 대표 명령 실행 불가
4, 127 대표 가 명령 을 찾 지 못 했 습 니 다.
5, 128 잘못된 종료 매개 변수
6, 128 + xlinux 신호 x 의 심각 한 오류
7, 130 대표 명령 Ctrl + C 를 통 해 종료
8, 255 탈퇴 상태 코드 경계 넘 기
JAVA 프로 그래 밍 에서 우 리 는 System. exit 를 사용 하면 가상 컴퓨터 의 운행 을 중지 할 수 있다 는 것 을 알 고 있 습 니 다. 그러면 Liux 에서 도 JAVA 의 return 키워드 exit 와 같은 종료 방법 이 있 습 니 다.
[root@h1 ~]# more t.sh 


echo "      "

sleep  5

exit 


echo "        ?"


[root@h1 ~]# sh t.sh 
      
[root@h1 ~]# echo $?
0
[root@h1 ~]# 

물론 우 리 는 되 돌아 오 는 상태 코드 를 실행 할 수 있다.
[root@h1 ~]# cat t.sh 


echo "      "

sleep  5

exit  88


echo "        ?"


[root@h1 ~]# sh t.sh 
      
[root@h1 ~]# echo $?
88
[root@h1 ~]# 

상태 코드 는 최대 255 이 고 255 가 넘 으 면 일률적으로 모델 링 을 받 을 수 있다 는 점 에 주의 하 셔 야 합 니 다.

좋은 웹페이지 즐겨찾기