首先聲明,此系列shell系列博客分為四篇發佈,分別是: 基礎篇:https://www.cnblogs.com/lsy131479/p/9914747.html 提升篇:https://www.cnblogs.com/lsy131479/p/9914897.html 高級篇:https://www ...
首先聲明,此系列shell系列博客分為四篇發佈,分別是:
基礎篇:https://www.cnblogs.com/lsy131479/p/9914747.html
提升篇:https://www.cnblogs.com/lsy131479/p/9914897.html
高級篇:https://www.cnblogs.com/lsy131479/p/9914962.html
面試篇:
1. Shell概述
為什麼要學習Shell呢?
1)需要看懂運維人員編寫的Shell程式。
2)偶爾會編寫一些簡單Shell程式來管理集群、提高開發效率。
2 .Shell解析器
(1)Linux提供的Shell解析器有:
[fsdm@hadoop101 ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/dash /bin/tcsh /bin/csh
常用的解析一般是 : /bin/bash
(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是引用的bash
(3)Centos預設的解析器是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)腳本的常用執行方式
第一種:採用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代表該腳本名稱,$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)“$((運算式))”或“$[運算式]”
(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
基礎篇結束,如需深入請閱讀後續篇章,如有疑問私信或評論指出