1. 程式人生 > >大數據系列博客之 --- 深入簡出 Shell 腳本語言(基礎篇)

大數據系列博客之 --- 深入簡出 Shell 腳本語言(基礎篇)

都是 判斷 變量定義 pre cls logs 簡單 vim spa

首先聲明,此系列shell系列博客分為四篇發布,分別是:

  基礎篇:https://www.cnblogs.com/lsy131479/p/9914747.html

  提升篇:https://www.cnblogs.com/lsy131479/p/9914897.html

  高級篇:

  面試篇:

1. Shell概述

為什麽要學習Shell呢?

1需要看懂運維人員編寫的Shell程序。

2偶爾會編寫一些簡單Shell程序來管理集群、提高開發效率

技術分享圖片

2 .Shell解析器

1Linux提供的Shell解析器有:

[fsdm@hadoop101 ~]$ cat /etc/shells 
/bin/sh /bin/bash /sbin/nologin /bin/dash /bin/tcsh /bin/csh

常用的解析一般是 : /bin/bash

2bashsh的關系

[fsdm@hadoop101 bin]$ ll | grep bash
-rwxr-xr-x. 1 root root 941880 5月  11 2016 bash
lrwxrwxrwx. 1 root root      4 5月  27 2017 sh -> bash

可以看到sh是引用的bash

3Centos默認的解析bash

[fsdm@hadoop102 bin]$ echo $SHELL
/bin/bash

3. Shell腳本入門

1腳本格式

腳本以#!/bin/bash開頭指定解析

2第一個Shell腳本helloworld

1)需求:創建一個Shell腳本,輸出helloworld

2案例實操:

[fsdm@hadoop101 datas]$ touch helloworld.sh
[fsdm@hadoop101 datas]$ vi helloworld.sh

在helloworld.sh中輸入如下內容
#!/bin/bash
echo "helloworld"

3腳本的常用執行方式

種:

采用bashsh+腳本相對路徑或絕對路徑(不用賦予腳本+x權限)

001.sh+腳本的相路徑

[fsdm@hadoop101 datas]$ sh helloworld.sh 
Helloworld

002.sh+腳本的絕對路徑

[fsdm@hadoop101 datas]$ sh /home/fsdm/datas/helloworld.sh 
helloworld

003.bash+腳本的相對路徑

[fsdm@hadoop101 datas]$ bash helloworld.sh 
Helloworld

004.bash+腳本絕對路徑

[fsdm@hadoop101 datas]$ bash /home/fsdm/datas/helloworld.sh 
Helloworld

種:采用輸入腳本的絕對路徑或相對路徑執行腳本必須具有可執行權限+x

a)首先要賦予helloworld.sh 腳本的+x權限

[fsdm@hadoop101 datas]$ chmod 777 helloworld.sh

b)執行腳本

相對路徑

[fsdm@hadoop101 datas]$ ./helloworld.sh 
Helloworld

絕對路徑

[fsdm@hadoop101 datas]$ /home/fsdm/datas/helloworld.sh 
Helloworld

註意:第一種執行方法,本質bash解析器幫你執行腳本,所以腳本本身不需要執行權限。二種執行方法,本質是腳本需要自己執行需要執行權限。

3Shell腳本:多命令處理

1)需求

/home/fsdm/目錄下創建一個banzhang.txt,banzhang.txt文件中增加“I love cls”

2)案例實操:

[fsdm@hadoop101 datas]$ touch batch.sh
[fsdm@hadoop101 datas]$ vi batch.sh

在batch.sh中輸入如下內容
#!/bin/bash

cd /home/fsdm
touch cls.txt
echo "I love cls" >>cls.txt

4. Shell中的變量

4.1 系統變量

1. 常用系統變量

$HOME$PWD$SHELL$USER

2案例實操

1)查看系統變量的值

[fsdm@hadoop101 datas]$ echo $HOME
/home/fsdm

2顯示當前Shell中所有變量:set

[fsdm@hadoop101 datas]$ set
BASH=/bin/bash
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()

4.2 自定義變量

1基本語法

1)定義變量:變量=

2)撤銷變量:unset 變量

3)聲明靜態變量:readonly變量,註意:不能unset

2變量定義規則

1)變量名稱可以由字母、數字和下劃線組成,但是不能以數字開頭環境變量名建議大寫

2等號兩側不能有空格

3bash中,變量默認類型都是字符串類型,無法直接進行數值運算。

4)變量的值如果有空格,需要使用雙引號或單引號括起來。

3案例實操

1)定義變量A

[fsdm@hadoop101 datas]$ A=5
[fsdm@hadoop101 datas]$ echo $A
5

2變量A重新賦值

[fsdm@hadoop101 datas]$ A=8
[fsdm@hadoop101 datas]$ echo $A
8

3)撤銷變量A

[fsdm@hadoop101 datas]$ unset A
[fsdm@hadoop101 datas]$ echo $A

4)聲明靜態變量B=2,不能unset或改變變量值

[fsdm@hadoop101 datas]$ readonly B=2
[fsdm@hadoop101 datas]$ echo $B
2
[fsdm@hadoop101 datas]$ B=9
-bash: B: readonly variable

  readonly 只讀(靜態變量)

5bash中,變量默認類型都是字符串類型,無法直接進行數值運算

[fsdm@hadoop102 ~]$ C=1+2
[fsdm@hadoop102 ~]$ echo $C
1+2

6變量的值如果有空格,需要使用雙引號或單引號括起來

[fsdm@hadoop102 ~]$ D=I love banzhang
-bash: world: command not found
[fsdm@hadoop102 ~]$ D="I love banzhang"
[fsdm@hadoop102 ~]$ echo $A
I love banzhang

7)可把變量提升為全局環境變量,可供其他Shell程序使用

export 變量名

[fsdm@hadoop101 datas]$ vim helloworld.sh 

在helloworld.sh文件中增加echo $B
#!/bin/bash

echo "helloworld"
echo $B

[fsdm@hadoop101 datas]$ ./helloworld.sh 
Helloworld

發現並沒有打印輸出變量B的值

我們 export 一下B,然後執行腳本:

[fsdm@hadoop101 datas]$ export B
[fsdm@hadoop101 datas]$ ./helloworld.sh 
helloworld
2

4.3 特殊變量$n

1基本語法

$n (功能描述:n為數字,$0代表該腳本名稱$1-$9代表第一到第九個參數,十以上的參數,十以上的參數需要用大括號包含,如${10}

2案例實操

1)輸出該腳本文件名稱輸入參數1和輸入參數2

[fsdm@hadoop101 datas]$ touch parameter.sh 
[fsdm@hadoop101 datas]$ vim parameter.sh

#!/bin/bash
echo "$0  $1   $2"

[fsdm@hadoop101 datas]$ chmod 777 parameter.sh

[fsdm@hadoop101 datas]$ ./parameter.sh cls  xz
./parameter.sh  cls   xz

4.4 特殊變量$#

1基本語法

$# (功能描述:獲取所有輸入參數個數,常用於循環

2案例實操

1獲取輸入參數的個數

[fsdm@hadoop101 datas]$ vim parameter.sh

#!/bin/bash
echo "$0  $1   $2"
echo $#

[fsdm@hadoop101 datas]$ chmod 777 parameter.sh

[fsdm@hadoop101 datas]$ ./parameter.sh cls  xz
parameter.sh cls xz 
2

4.5 特殊變量$*$@

1基本語法

$* (功能描述:這個變量代表命令行中所有的參數,$*把所有的參數看成一個整體)

$@ (功能描述:這個變量也代表命令行中所有的參數,不過$@把每個參數區分對待)

2案例實操

1)打印輸入所有參數

[fsdm@hadoop101 datas]$ vim parameter.sh

#!/bin/bash
echo "$0  $1   $2"
echo $#
echo $*
echo $@

[fsdm@hadoop101 datas]$ bash parameter.sh 1 2 3
parameter.sh  1   2
3
1 2 3
1 2 3

4.6 特殊變量$

1基本語法

$ (功能描述:最後一次執行的命令的返回狀態。如果這個變量的值為0,證明上一個命令正確執行;如果這個變量的值為非0(具體是哪個數,由命令自己來決定),則證明上一個命令執行不正確了。)

2案例實操

1判斷helloworld.sh腳本是否正確執行

[fsdm@hadoop101 datas]$ ./helloworld.sh 
hello world
[fsdm@hadoop101 datas]$ echo $?
0

5. 運算符

1基本語法

1“$((運算式))”“$[運算式]”

2expr + , - , \*, /, % ,乘,除,取余

註意expr運算符間要有空格

2案例實操:

1計算3+2的值

[fsdm@hadoop101 datas]$ expr 2 + 3
5

2計算3-2的值

[fsdm@hadoop101 datas]$ expr 3 - 2 
1

3計算(2+3*4的值

aexpr一步完成計算

[fsdm@hadoop101 datas]$ expr `expr 2 + 3` \* 4
20

b)采用$[運算式]方式

[fsdm@hadoop101 datas]# S=$[(2+3)*4]
[fsdm@hadoop101 datas]# echo $S

基礎篇結束,如需深入請閱讀後續篇章,如有疑問私信或評論指出

大數據系列博客之 --- 深入簡出 Shell 腳本語言(基礎篇)