shell基礎篇

1. Shell概述

爲何要學習Shell呢?shell

1)須要看懂運維人員編寫的Shell程序。vim

2)偶爾會編寫一些簡單Shell程序來管理集羣、提升開發效率。bash

 

2 .Shell解析器

(1)Linux提供的Shell解析器有:運維

 

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

 經常使用的解析通常是 : /bin/bashoop

(2)bash和sh的關係學習

[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是引用的bashthis

(3)Centos默認的解析器是bashspa

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

3. Shell腳本入門

1.腳本格式命令行

腳本以#!/bin/bash開頭(指定解析器)code

 

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)腳本的經常使用執行方式

第一種:採用bash或sh+腳本的相對路徑或絕對路徑(不用賦予腳本+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解析器幫你執行腳本,因此腳本自己不須要執行權限。第二種執行方法,本質是腳本須要本身執行,因此須要執行權限。

 

3.第二個Shell腳本:多命令處理

 

(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)等號兩側不能有空格

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

(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 只讀(靜態變量)

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

 

[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表明該腳本名稱,11− 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)「$((運算式))」或「$[運算式]」

(2)expr  + , - , \*,  /,  %    加,減,乘,除,取餘

注意: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的值

(a)expr一步完成計算 

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

(b)採用$[運算式]方式

 

[fsdm@hadoop101 datas]# S=$[(2+3)*4]
[fsdm@hadoop101 datas]# echo $S
相關文章
相關標籤/搜索